[home] Many misc changes :/

Ilya Portnov [2011-05-11 13:34:24]
[home] Many misc changes :/
Filename
lib/AppGroups.hs
lib/CommonFunctions.hs
lib/GroupsSetup.hs
lib/KeyBindings.hs
lib/Layouts.hs
lib/MyManageHooks.hs
lib/Themes.hs
xmonad.hs
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)
ViewGit