From 274bfd2703a9c0b797a51927eb8201423729492e Mon Sep 17 00:00:00 2001 From: Ilya Portnov Date: Wed, 11 May 2011 19:34:24 +0600 Subject: [PATCH] [home] Many misc changes :/ --- lib/AppGroups.hs | 30 ++++++++-------------------- lib/CommonFunctions.hs | 21 +++++++++++++++++++- lib/GroupsSetup.hs | 30 ++++++++++++++-------------- lib/KeyBindings.hs | 49 ++++++++++++++++------------------------------- lib/Layouts.hs | 34 ++++++++++++++++++++------------ lib/MyManageHooks.hs | 38 +++++++++++++++++++++++++++++++++--- lib/Themes.hs | 13 +++++++++-- xmonad.hs | 5 +-- 8 files changed, 128 insertions(+), 92 deletions(-) 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` "" `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-", - 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-", gnomeRun), +addKeys = [-- ("M1-", gnomeRun), ("M1-", spawn "gmrun"), ("", 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-", 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-", bindOn [("inet", Ex.swapGroupMaster), - ("", dwmpromote)]), + ("M-", 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"), ("", switchToApp myGSConfig myApps "internet" ), ("", switchToApp myGSConfig myApps "files"), + ("", switchToApp myGSConfig myApps "mail"), ("", spawn "ksnapshot"), ("S-", 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) -- 1.7.2.3