diff --git a/lib/AppGroups.hs b/lib/AppGroups.hs
index 0b2a27e..7040f95 100644
--- a/lib/AppGroups.hs
+++ b/lib/AppGroups.hs
@@ -1,6 +1,7 @@
{-# LANGUAGE ExistentialQuantification, TypeSynonymInstances, FlexibleInstances #-}
module AppGroups
(Key, App (..), Apps, Condition (..), Cond (..), Regex (..),
+ query,
oneOf, apps2hooks, apps2keys,
selectAppGroup,
switchToApp,
@@ -16,12 +17,10 @@ import qualified XMonad.StackSet as W
import XMonad.Actions.GridSelect
import XMonad.Actions.DynamicWorkspaces
-import XMonad.Layout.Minimize
import XMonad.Util.WindowProperties
-import XMonad.Util.NamedWindows
-import XMonad.Hooks.ManageHelpers hiding (C)
+-- import XMonad.Hooks.ManageHelpers hiding (C)
-import CommonFunctions ((~?))
+import CommonFunctions ((~?), selectOneWindow)
-- | Shortcut key
type Key = String
@@ -132,12 +131,12 @@ oneOf :: [Query Bool] -> Query Bool
oneOf list = foldl1 (<||>) list
-- | Checks if window is transient to another
-isNotTransient :: Query Bool
-isNotTransient = do
- mbw <- transientTo
- case mbw of
- Nothing -> return True
- Just _ -> return False
+-- isNotTransient :: Query Bool
+-- isNotTransient = do
+-- mbw <- transientTo
+-- case mbw of
+-- Nothing -> return True
+-- Just _ -> return False
conditions :: App -> Conds
conditions (On app _) = conditions app
@@ -207,17 +206,6 @@ selectWithQuery gsconfig qry run = do
[w] -> focus w
_ -> selectOneWindow gsconfig wins
--- | Switch to window, which is selected from given list
-selectOneWindow :: GSConfig Window -> [Window] -> X ()
-selectOneWindow gsconfig wins = do
- titles <- mapM windowTitle wins
- selected <- gridselect gsconfig $ zip titles wins
- whenJust selected $ \w -> do
- focus w
- sendMessage (RestoreMinimizedWin w)
- where
- windowTitle w = show `fmap` getName w
-
-- | Switch to selected appgroup.
switchToApp :: GSConfig Window -> Apps -> String -> X ()
switchToApp gsconfig apps name =
diff --git a/lib/CommonFunctions.hs b/lib/CommonFunctions.hs
index 55e9506..d0cde73 100644
--- a/lib/CommonFunctions.hs
+++ b/lib/CommonFunctions.hs
@@ -5,10 +5,12 @@ module CommonFunctions
trashWindow, emptyCurrentWorkspace,
moveToWorkspace,
gotoWorkspace,
+ selectOneWindow, searchInWorkspace,
specialMove,
vimsessions, textEditors,
recent,
(~?),
+ isFloat,
rotateWindows, rotateWindows',
unmapEventHook)
where
@@ -27,10 +29,11 @@ import XMonad
import qualified XMonad.StackSet as W
import XMonad.Util.WindowProperties
import XMonad.Layout.LayoutCombinators
+import XMonad.Layout.Minimize
import XMonad.Prompt.Input
+import XMonad.Util.NamedWindows
-import XMonad.Actions.GroupNavigation
import XMonad.Actions.DynamicWorkspaces
import XMonad.Actions.GridSelect
@@ -219,6 +222,22 @@ textEditors = do
Just "gvim" -> vimsessions
Just editor -> spawn editor
+-- | Switch to window, which is selected from given list
+selectOneWindow :: GSConfig Window -> [Window] -> X ()
+selectOneWindow gsconfig wins = do
+ titles <- mapM windowTitle wins
+ selected <- gridselect gsconfig $ zip titles wins
+ whenJust selected $ \w -> do
+ focus w
+ sendMessage (RestoreMinimizedWin w)
+ where
+ windowTitle w = show `fmap` getName w
+
+searchInWorkspace :: GSConfig Window -> X ()
+searchInWorkspace gsconfig = do
+ ws <- currentList
+ selectOneWindow gsconfig ws
+
-- | Move current window to `trash' workspace
trashWindow :: X ()
trashWindow = do
diff --git a/lib/GroupsSetup.hs b/lib/GroupsSetup.hs
index 85b484b..54f7163 100644
--- a/lib/GroupsSetup.hs
+++ b/lib/GroupsSetup.hs
@@ -12,24 +12,24 @@ defaultFM = "konqueror --profile filemanagement"
myApps =
[ "iceweasel" ::: [C "Epiphany-browser", C "Kontact", C "Iceweasel",
- C "Firefox", C "Opera", C "Arora" ] :-> "inet" `On` "M1-!" `Named` "internet",
- "icedove" ::: [C "Icedove", C "Kontact" ] :-> "inet" `On` "<XF86Mail>" `Named` "mail",
+ C "Firefox", C "Opera", C "Arora" ] :-> "inet" `On` "M1-x w" `Named` "internet",
+ "icedove" ::: [C "Icedove", C "Kontact" ] :-> "inet" `On` "M1-x y" `Named` "mail",
"rssowl" ::: [C "Liferea", C "RSSOwl"] :-> "inet" `Named` "rss",
- "transmission" ::: [C "Transmission"] :-> "torrents" `On` "M1-.",
+ "transmission-gtk" ::: [regex "Transmission"] :-> "torrents" `On` "M1-x r",
Group [C "Inkscape", C "Eog", C "Gwenview", C "Dia",
- C "MyPaint"] :-> "graphics" `On` "M1-/",
- Group [regex "Gimp"] :-> "gimp" `On` "M1-g",
- Group [C "F-spot",C "Digikam"] :-> "photo" `On` "M1-d",
- "gnome-terminal" ::: [C "Gnome-terminal", C "Konsole"] :-> "term" `On` "M1-;",
+ C "MyPaint"] :-> "graphics" `On` "M1-x d",
+ Group [regex "Gimp"] :-> "gimp" `On` "M1-x g",
+ Group [C "F-spot",C "Digikam"] :-> "photo" `On` "M1-x p",
+ "gnome-terminal" ::: [C "Gnome-terminal", C "Konsole"] :-> "term" `On` "M1-x t",
textEditors :>> [C "Gedit", C "Leafpad",
- C "Gvim", C "Kate", C "KWrite", C "Emacs"] :-> "text" `On` "M1-#",
- recent ["doc"] ::: [regex "libreoffice", C "TeXmacs"] :-> "office" `On` "M1-o",
- recent ["pdf","djvu"] ::: [C "Evince", C "Okular"] :-> "docs" `On` "M1-:",
+ C "Gvim", C "Kate", C "KWrite", C "Emacs"] :-> "text" `On` "M1-x e",
+ recent ["doc"] ::: [regex "libreoffice", C "TeXmacs"] :-> "office" `On` "M1-x o",
+ recent ["pdf","djvu"] ::: [C "Evince", C "Okular"] :-> "docs" `On` "M1-x k",
defaultFM ::: [C "Nautilus", C "Dolphin", C "Konqueror",
- C "Krusader"] :-> "files" `On` "M1-*",
+ C "Krusader"] :-> "files" `On` "M1-x f",
Group [C "Amarok", C "Rhythmbox",
- regex "Audacious" ] :-> "music" `On` "M1-p",
- Group [C "MPlayer", C "Totem"] :-> "video" `On` "M1-<F8>",
- Group [C "Wxmaxima"] :-> "math" `On` "M1-?",
- "pidgin" ::: [C "Pidgin", C "Kopete"] :-> "im" `On` "M1-%" ]
+ regex "Audacious" ] :-> "music" `On` "M1-x a",
+ Group [C "MPlayer", C "Totem"] :-> "video" `On` "M1-x v",
+ Group [C "Wxmaxima"] :-> "math" `On` "M1-x m",
+ "pidgin" ::: [C "Pidgin", C "Kopete"] :-> "im" `On` "M1-x i" ]
diff --git a/lib/KeyBindings.hs b/lib/KeyBindings.hs
index 31d041e..b2b8bbe 100644
--- a/lib/KeyBindings.hs
+++ b/lib/KeyBindings.hs
@@ -19,23 +19,19 @@ import XMonad.Actions.DwmPromote
import XMonad.Actions.GridSelect
import XMonad.Actions.FindEmptyWorkspace
import XMonad.Actions.GroupNavigation
-import XMonad.Actions.PerWorkspaceKeys
import XMonad.Layout.MultiToggle
import XMonad.Layout.MultiToggle.Instances
import XMonad.Layout.Maximize
import XMonad.Layout.Minimize
import XMonad.Layout.SubLayouts
-import XMonad.Layout.SubLayouts
-import qualified XMonad.Layout.Groups as G
-import qualified XMonad.Layout.Groups.Examples as Ex
import qualified XMonad.Layout.WindowNavigation as Nav
import XMonad.Prompt.Window
import CommonFunctions
-import Themes (myXPConfig, myGSConfig)
-import AppGroups (selectAppGroup, switchToApp)
+import Themes (myXPConfig, myGSConfig, searchGS)
+import AppGroups (switchToApp)
import GroupsSetup (myApps)
workspaceOrder = ["inet","text","files","im","term"]
@@ -67,11 +63,7 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = (M.fromList $
, (f, m) <- [(gotoWorkspace, 0), (moveToWorkspace, shiftMask)]] )
`M.union` planeKeys modMask (Lines 1) Circular
-addKeys = [("M-s n", spawn "screenslide start"),
- ("M-s s", spawn "screenslide slide"),
- ("M-s b", spawn "screenslide browse-save"),
- ("M-s t", promptOSD),
--- ("M1-<F2>", gnomeRun),
+addKeys = [-- ("M1-<F2>", gnomeRun),
("M1-<F2>", spawn "gmrun"),
("<Pause>", spawn "qwerty.py -a -f -g 640x400"),
("M-v", vimsessions),
@@ -86,7 +78,6 @@ addKeys = [("M-s n", spawn "screenslide start"),
("M-c", chooseLayout "coding"),
("M-m", chooseLayout "mirror"),
("M-f", chooseLayout "Full"),
- ("M-g", chooseLayout "gimp"),
("M-i", chooseLayout "im"),
("M-a", chooseLayout "Grid"),
("M-o", chooseLayout "onebig"),
@@ -105,8 +96,9 @@ addKeys = [("M-s n", spawn "screenslide start"),
-- Bring any window to current workspace
("M1-w", windowPromptBring myXPConfig),
- ("M1-z", goToSelected myGSConfig),
- ("M1-x", selectAppGroup myGSConfig myGSConfig myApps),
+ ("M1-x x", searchInWorkspace searchGS),
+ ("M1-z", goToSelected searchGS),
+ ("M-z", gridselectWorkspace searchGS W.greedyView),
("M1-e", viewEmptyWorkspace),
("M1-S-e", windows $ emptyCurrentWorkspace),
@@ -117,35 +109,27 @@ addKeys = [("M-s n", spawn "screenslide start"),
-- Move focus to the next window
("M1-<Tab>", windows W.focusDown),
- ("M-j", bindOn [("inet", Ex.focusDown), ("", windows W.focusDown)]),
- ("M-k", bindOn [("inet", Ex.focusUp), ("", windows W.focusUp)] ),
+ ("M-j", windows W.focusDown),
+ ("M-k", windows W.focusUp ),
-- Rotate windows list
- ("M-C-j", bindOn [("inet", Ex.focusGroupDown),
- ("", rotateWindows)] ),
- ("M-C-k", bindOn [("inet", Ex.focusGroupUp),
- ("", rotateWindows')] ),
+ ("M-C-j", rotateWindows ),
+ ("M-C-k", rotateWindows'),
-- Swap the focused window and the master window
- ("M-<Return>", bindOn [("inet", Ex.swapGroupMaster),
- ("", dwmpromote)]),
+ ("M-<Return>", dwmpromote),
-- Swap the focused window with the next window
- ("M-S-j", bindOn [("inet", Ex.swapDown),
- ("", windows W.swapDown)]),
- ("M-S-k", bindOn [("inet", Ex.swapUp),
- ("", windows W.swapUp)]),
+ ("M-S-j", windows W.swapDown),
+ ("M-S-k", windows W.swapUp),
-- Tab/Untab
- ("M-M1-j", bindOn [("inet", Ex.moveToGroupDown False),
- ("", sendMessage $ pushWindow Nav.D)]),
- ("M-M1-l", bindOn [("inet", Ex.moveToGroupUp False),
- ("", sendMessage $ pushWindow Nav.R)]),
+ ("M-M1-j", sendMessage $ pushWindow Nav.D),
+ ("M-M1-l", sendMessage $ pushWindow Nav.R),
("M-M1-k", sendMessage $ pushWindow Nav.U),
("M-M1-h", sendMessage $ pushWindow Nav.L),
- ("M-M1-u", bindOn [("inet", Ex.splitGroup),
- ("", withFocused (sendMessage . UnMerge))]),
+ ("M-M1-u", withFocused (sendMessage . UnMerge)),
("M-M1-u", withFocused (sendMessage . UnMergeAll)),
@@ -170,6 +154,7 @@ addKeys = [("M-s n", spawn "screenslide start"),
("<XF86Search>", switchToApp myGSConfig myApps "internet" ),
("<XF86HomePage>", switchToApp myGSConfig myApps "files"),
+ ("<XF86Mail>", switchToApp myGSConfig myApps "mail"),
("<Print>", spawn "ksnapshot"),
("S-<Print>", promptPublishShot),
diff --git a/lib/Layouts.hs b/lib/Layouts.hs
index 4c74871..b1f01bc 100644
--- a/lib/Layouts.hs
+++ b/lib/Layouts.hs
@@ -19,8 +19,6 @@ import XMonad.Layout.Reflect
import XMonad.Layout.MagicFocus
import XMonad.Layout.CenteredMaster
import XMonad.Layout.OneBig
-import XMonad.Layout.MultiToggle
-import XMonad.Layout.MultiToggle.Instances
import XMonad.Layout.NoBorders
import XMonad.Layout.ComboP
import XMonad.Layout.TwoPane
@@ -32,23 +30,33 @@ import XMonad.Layout.Tabbed
import XMonad.Layout.TrackFloating
import XMonad.Layout.Maximize
import XMonad.Layout.Minimize
-import XMonad.Layout.SubLayouts
import XMonad.Layout.Simplest
import XMonad.Layout.Groups
import qualified XMonad.Layout.WindowNavigation as Nav
+import LayoutBuilderP
import Themes
+lugChats = Title "lug-mgn" `Or` Title "math"
+xmonadChats = Title "xmonad" `Or` Title "#xmonad"
+programmingChats = Title "programming" `Or` Title "haskell" `Or` Title "python"
+
+fullscreenRect = Just $ relBox 0 0 1 1
+
----------------------------------------------------
--- Layout modifier toggle
-toggleMirror = mkToggle (single MIRROR)
-tWithIM = withIM (1%6) ((Role "buddy_list") `Or` (Role "MainWindow") `Or` (Role "MainWindow#1"))
+tWithIM = withIM (1%6) (Role "buddy_list")
+
+isGfxPanel = Role "gimp-toolbox" `Or` Role "Brush selector" `Or` Role "toolbox_window" `Or` Role "Layers"
-isGfxPanel = (Role "gimp-toolbox") `Or` (Role "Brush selector") `Or` (Role "toolbox_window") `Or` (Role "Layers")
+tabs = tabbed shrinkText deco
-imlayout = addTabs shrinkText deco $ subLayout [] Simplest (Grid 2)
-tabgrid = group (tabbed shrinkText deco) (Mirror $ Tall 1 (1/100) (2/3))
+-- imlayout = addTabs shrinkText deco $ subLayout [] Simplest (autoMaster 2 (1/100) $ Grid 2)
+imlayout = (layoutP programmingChats (relBox 0 0 0.55 0.5) fullscreenRect tabs)
+ $ (layoutP xmonadChats (relBox 0.55 0 1 0.5) Nothing tabs)
+ $ (layoutP lugChats (relBox 0.45 0.5 1 1) (Just $ relBox 0 0.5 1 1) tabs)
+ $ (layoutAll (relBox 0 0.5 0.45 1) tabs)
+tabgrid = group tabs (Mirror $ Tall 1 (1/100) (2/3))
tabfull = addTabs shrinkText deco Simplest
grid = named "grid" $ Grid (2)
@@ -68,7 +76,7 @@ books = named "books" (Tall 1 (1/100) (2/3))
-- rowtile = Mirror hortile
-- mgrid = centerMaster grid
-- forim = named "im" (tWithIM (minimax grid ||| minimax autogrid2 ||| zgrid ||| Full))
-forim = named "im" $ tWithIM imlayout
+forim = named "im" $ tWithIM (imlayout ||| tabs)
column = Column 1.8
forgimp = named "gimp" $ withButtons $ combineTwoP (TwoPane 0.03 0.75) column (reflectVert $ Column 0.4) $ Not isGfxPanel
onebig = named "onebig" $ (OneBig (3/4) (3/4))
@@ -81,11 +89,11 @@ deco = defaultTheme {activeColor = myFocusedBorderColor,
inactiveColor = "#E6DCD1",
inactiveTextColor = "#000000",
decoHeight = 24,
- fontName = "xft:Arial-12"}
+ fontName = myFont }
decoB = defaultThemeWithButtons {activeColor = myFocusedBorderColor,
activeTextColor = "#000000",
- fontName = "xft:Arial-10"}
+ fontName = myFont}
withButtons = buttonDeco shrinkText decoB
@@ -100,7 +108,7 @@ myLayout = trackFloating $
Nav.configurableNavigation (Nav.navigateBrightness 0.0) $
avoidStruts $
-- Tab.modify shrinkText deco $
- onWorkspace "inet" (minimax full ||| minimax tabgrid) $
+ onWorkspace "inet" (minimax full) $
onWorkspace "text" (minimax full ||| minimax autogrid2 ||| minimax dwmtile ||| minimax mirrored ||| books ||| autogrid ||| onebig ) $
onWorkspace "files" (minimax full ||| minimax dwmtile ||| autogrid) $
onWorkspace "im" forim $
diff --git a/lib/MyManageHooks.hs b/lib/MyManageHooks.hs
index 1201688..89d1bed 100644
--- a/lib/MyManageHooks.hs
+++ b/lib/MyManageHooks.hs
@@ -5,15 +5,18 @@ module MyManageHooks
-- To be able to query X11 atoms and such on
import Foreign.C.Types (CLong)
+import Graphics.X11.Xlib.Extras
-import Control.Monad (liftM)
+import Data.Char (toLower)
import XMonad
+import qualified XMonad.StackSet as W
import XMonad.Hooks.ManageHelpers hiding (C)
+import XMonad.Actions.DynamicWorkspaces
-import AppGroups (doFullscreen, apps2hooks)
+import AppGroups
import GroupsSetup (myApps)
-import CommonFunctions ((~?))
+import CommonFunctions ((~?), isFloat)
myManageHook = basehooks <+> manageMenus <+> manageDialogs <+> floatPlasma
@@ -49,7 +52,34 @@ getProp w a = withDisplay $ \dpy -> io $ getWindowProperty32 dpy a w
-- mNot = liftM not
-basehooks = composeAll (apps2hooks myApps) <+> transience'
+windowWorkspace :: Window -> X WorkspaceId
+windowWorkspace win = do
+ cls <- withDisplay $ \d -> fmap resName $ io $ getClassHint d win
+ let cls' = map (anySeparatorToSpace . toLower) cls
+ wksp = head $ words cls'
+ return wksp
+ where
+ anySeparatorToSpace c | c `elem` "-._#" = ' '
+ | otherwise = c
+
+moveToOwnWorkspace :: Apps -> ManageHook
+moveToOwnWorkspace apps = do
+ window <- ask
+ matching <- liftX $ runQuery (oneOf $ map query apps) window
+ floating <- liftX $ isFloat window
+ if matching || floating
+ then doF id
+ else do
+ wksp <- liftX (windowWorkspace window)
+ if (wksp `notElem` notCreateWorkspace)
+ then do
+ liftX $ addWorkspace wksp
+ doF (W.shift wksp)
+ else doF id
+
+basehooks = composeAll (apps2hooks myApps) <+> moveToOwnWorkspace myApps <+> transience'
+
+notCreateWorkspace = ["gmrun", "plasma", "gcolor2", "ksnapshot"]
floatPlasma = composeAll
[ className =? "Qt-subapplication" --> doFloat,
diff --git a/lib/Themes.hs b/lib/Themes.hs
index 3a48f8c..003d740 100644
--- a/lib/Themes.hs
+++ b/lib/Themes.hs
@@ -6,17 +6,24 @@ import XMonad
import XMonad.Prompt
import XMonad.Actions.GridSelect
+myFont = "xft:Ubuntu-11"
+
-- | My XMonad Prompt config
myXPConfig :: XPConfig
myXPConfig = defaultXPConfig {
- font = "xft:Arial-10",
+ font = myFont,
bgColor = myFocusedBorderColor,
fgColor = "#000000" }
myGSConfig :: HasColorizer a => GSConfig a
myGSConfig = defaultGSConfig {
gs_navigate = myNavigation,
- gs_font = "xft:Arial-10" }
+ gs_font = myFont }
+
+searchGS :: HasColorizer a => GSConfig a
+searchGS = defaultGSConfig {
+ gs_navigate = navNSearch,
+ gs_font = myFont }
-----------------------------------------------------------------------
-- Some general settings
@@ -24,7 +31,7 @@ myWorkspaces :: [WorkspaceId]
myWorkspaces = ["main"]
myFocusedBorderColor :: String
-myFocusedBorderColor = "#97ACC1"
+myFocusedBorderColor = "#E3A775"
myBorderWidth :: Dimension
myBorderWidth = 1
diff --git a/xmonad.hs b/xmonad.hs
index 471a51d..0015895 100644
--- a/xmonad.hs
+++ b/xmonad.hs
@@ -1,5 +1,4 @@
import XMonad
-
import XMonad.Util.EZConfig (additionalKeysP)
-- import XMonad.Config.Gnome
@@ -29,7 +28,7 @@ baseManageHook = manageHook baseConfig
baseLogHook = logHook baseConfig
main = do
- xmonad $ ewmh $ baseConfig {
+ xmonad $ ewmh $ baseConfig {
terminal = "gnome-terminal",
focusFollowsMouse = False,
borderWidth = myBorderWidth,
@@ -51,5 +50,5 @@ main = do
baseLogHook
historyHook
setWMName "LG3D"
- } `additionalKeysP` (addKeys ++ apps2keys myGSConfig myApps)
+ } `additionalKeysP` (addKeys ++ apps2keys searchGS myApps)