From f56e7fc0e27242d7700a6a8afa669647b7c491fc Mon Sep 17 00:00:00 2001 From: Sanchayan Maity Date: Tue, 3 Jan 2017 16:18:32 +0530 Subject: [PATCH] XMonad configuration --- xmonad/xmobar.hs | 48 ++++++ xmonad/xmonad.hs | 400 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 448 insertions(+) create mode 100644 xmonad/xmobar.hs create mode 100644 xmonad/xmonad.hs diff --git a/xmonad/xmobar.hs b/xmonad/xmobar.hs new file mode 100644 index 0000000..5128f10 --- /dev/null +++ b/xmonad/xmobar.hs @@ -0,0 +1,48 @@ +-- xmobar config originally from Vic Fryzel +-- Author: Vic Fryzel +-- Changes by: Sanchayan Maity +-- http://github.com/SanchayanMaity/xmonad-config + +-- This is setup for dual 1920x1080 monitors, with the right monitor as primary +Config { + font = "xft:Ubuntu Mono:size=12:antialias=true", + bgColor = "#000000", + fgColor = "#ffffff", + position = BottomW C 100, + lowerOnStart = True, + commands = [ + Run MultiCpu ["-t", + "Cpu: ", + "-L","30", + "-H","60", + "-h","#FFB6B0", + "-l","#CEFFAC", + "-n","#FFFFCC", + "-w","3"] 10, + Run BatteryP ["BAT0"] + ["-t", " (%)", + "-L", "10", "-H", "80", "-p", "3", + "--", "-O", "On - ", "-i", "", + "-L", "-15", "-H", "-5", + "-l", "red", "-m", "blue", "-h", "green"] 600, + Run Memory ["-t", + "Mem: %", + "-H","8192", + "-L","4096", + "-h","#FFB6B0", + "-l","#CEFFAC", + "-n","#FFFFCC"] 10, + Run Swap ["-t", + "Swap: %", + "-H","1024", + "-L","512", + "-h","#FFB6B0", + "-l","#CEFFAC", + "-n","#FFFFCC"] 10, + Run Date "%a %b %_d %l:%M" "date" 10, + Run StdinReader + ], + sepChar = "%", + alignSep = "}{", + template = "%StdinReader% }{ %multicpu% %battery% %memory% %swap% %date%" +} diff --git a/xmonad/xmonad.hs b/xmonad/xmonad.hs new file mode 100644 index 0000000..66bcfd0 --- /dev/null +++ b/xmonad/xmonad.hs @@ -0,0 +1,400 @@ +-- xmonad config originally from Vic Fryzel +-- Author: Vic Fryzel +-- Changes by: Sanchayan Maity +-- http://github.com/SanchayanMaity/xmonad-config + +import System.IO +import System.Exit +import XMonad +import XMonad.Actions.CycleWS +import XMonad.Hooks.DynamicLog +import XMonad.Hooks.ManageDocks +import XMonad.Hooks.ManageHelpers +import XMonad.Hooks.SetWMName +import XMonad.Layout.Fullscreen +import XMonad.Layout.NoBorders +import XMonad.Layout.Spiral +import XMonad.Layout.Tabbed +import XMonad.Layout.ThreeColumns +import XMonad.Layout.IndependentScreens +import XMonad.Util.Run(spawnPipe) +import XMonad.Util.EZConfig(additionalKeys) +import Graphics.X11.ExtraTypes.XF86 +import qualified XMonad.StackSet as W +import qualified Data.Map as M + + +------------------------------------------------------------------------ +-- Terminal +-- The preferred terminal program, which is used in a binding below and by +-- certain contrib modules. +-- +myTerminal = "/usr/bin/urxvt" + +-- The command to lock the screen or show the screensaver. +myScreensaver = "/usr/bin/gnome-screensaver-command --lock" + +-- The command to take a selective screenshot, where you select +-- what you'd like to capture on the screen. +mySelectScreenshot = "scrot ~/Pictures/%Y-%m-%d-%T-screenshot.png" + +-- The command to take a fullscreen screenshot. +myScreenshot = "scrot ~/Pictures/%Y-%m-%d-%T-screenshot.png" + +-- The command to use as a launcher, to launch commands that don't have +-- preset keybindings. +myLauncher = "$(rofi -show run)" + + +------------------------------------------------------------------------ +-- Workspaces +-- The default number of workspaces (virtual screens) and their names. +-- +myWorkspaces = ["1:okular","2:urxvt","3:web","4:code","5:urxvt","6:urxvt","7:urxvt","8:media","9:Misc"] + + +------------------------------------------------------------------------ +-- Window rules +-- Execute arbitrary actions and WindowSet manipulations when managing +-- a new window. You can use this to, for example, always float a +-- particular program, or have a client always appear on a particular +-- workspace. +-- +-- To find the property name associated with a program, use +-- > xprop | grep WM_CLASS +-- and click on the client you're interested in. +-- +-- To match on the WM_NAME, you can use 'title' in the same way that +-- 'className' and 'resource' are used below. +-- +myManageHook = composeAll + [ className =? "Chromium" --> doFloat + , className =? "google-chrome" --> doFloat + , className =? "emacs" --> doFloat + , className =? "transmission-gtk" --> doFloat + , className =? "skypeforlinux" --> doFloat + , className =? "vlc" --> doFloat + , className =? "thunar" --> doFloat + , className =? "okular" --> doFloat + , resource =? "desktop_window" --> doIgnore + , className =? "kcalc" --> doFloat + , className =? "stalonetray" --> doIgnore + , isFullscreen --> (doF W.focusDown <+> doFullFloat)] + + +------------------------------------------------------------------------ +-- Layouts +-- You can specify and transform your layouts by modifying these values. +-- If you change layout bindings be sure to use 'mod-shift-space' after +-- restarting (with 'mod-q') to reset your layout state to the new +-- defaults, as xmonad preserves your old layout settings by default. +-- +-- The available layouts. Note that each layout is separated by |||, +-- which denotes layout choice. +-- +myLayout = avoidStruts ( + ThreeColMid 1 (3/100) (1/2) ||| + Tall 1 (3/100) (1/2) ||| + Mirror (Tall 1 (3/100) (1/2)) ||| + tabbed shrinkText tabConfig ||| + Full ||| + spiral (6/7)) ||| + noBorders (fullscreenFull Full) + + +------------------------------------------------------------------------ +-- Colors and borders +-- Currently based on the ir_black theme. +-- +myNormalBorderColor = "#7c7c7c" +myFocusedBorderColor = "#ffb6b0" + +-- Colors for text and backgrounds of each tab when in "Tabbed" layout. +tabConfig = def { + activeBorderColor = "#7C7C7C", + activeTextColor = "#CEFFAC", + activeColor = "#000000", + inactiveBorderColor = "#7C7C7C", + inactiveTextColor = "#EEEEEE", + inactiveColor = "#000000" +} + +-- Color of current window title in xmobar. +xmobarTitleColor = "#FFB6B0" + +-- Color of current workspace in xmobar. +xmobarCurrentWorkspaceColor = "#CEFFAC" + +-- Width of the window border in pixels. +myBorderWidth = 1 + + +------------------------------------------------------------------------ +-- Key bindings +-- +-- modMask lets you specify which modkey you want to use. The default +-- is mod1Mask ("left alt"). You may also consider using mod3Mask +-- ("right alt"), which does not conflict with emacs keybindings. The +-- "windows key" is usually mod4Mask. +-- +myModMask = mod4Mask + +myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $ + ---------------------------------------------------------------------- + -- Custom key bindings + -- + + -- Start a terminal. Terminal to start is specified by myTerminal variable. + [ ((modMask .|. shiftMask, xK_Return), + spawn $ XMonad.terminal conf) + + -- Lock the screen using command specified by myScreensaver. + , ((modMask .|. controlMask, xK_l), + spawn myScreensaver) + + -- Spawn the launcher using command specified by myLauncher. + -- Use this to launch programs without a key binding. + , ((modMask, xK_p), + spawn myLauncher) + + -- Take a selective screenshot using the command specified by mySelectScreenshot. + , ((modMask .|. shiftMask, xK_p), + spawn mySelectScreenshot) + + -- Take a full screenshot using the command specified by myScreenshot. + , ((modMask .|. controlMask .|. shiftMask, xK_p), + spawn myScreenshot) + + -- Mute volume. + , ((0, xF86XK_AudioMute), + spawn "amixer -q set Master toggle") + + -- Decrease volume. + , ((0, xF86XK_AudioLowerVolume), + spawn "amixer -q set Master 5%-") + + -- Increase volume. + , ((0, xF86XK_AudioRaiseVolume), + spawn "amixer -q set Master 5%+") + + -- Mute volume. + , ((modMask .|. controlMask, xK_m), + spawn "amixer -q set Master toggle") + + -- Decrease volume. + , ((modMask .|. controlMask, xK_j), + spawn "amixer -q set Master 10%-") + + -- Increase volume. + , ((modMask .|. controlMask, xK_k), + spawn "amixer -q set Master 10%+") + + -- Audio previous. + , ((0, 0x1008FF16), + spawn "") + + -- Play/pause. + , ((0, 0x1008FF14), + spawn "") + + -- Audio next. + , ((0, 0x1008FF17), + spawn "") + + -- Eject CD tray. + , ((0, 0x1008FF2C), + spawn "eject -T") + + -- Increase brightness. + , ((0, xF86XK_MonBrightnessUp), + spawn "exec xbacklight -inc 5") + + -- Decrease brightness. + , ((0, xF86XK_MonBrightnessDown), + spawn "exec xbacklight -dec 5") + -------------------------------------------------------------------- + -- "Standard" xmonad key bindings + -- + + -- Close focused window. + , ((modMask .|. shiftMask, xK_q), + kill) + + -- Cycle through the available layout algorithms. + , ((modMask, xK_space), + sendMessage NextLayout) + + -- Reset the layouts on the current workspace to default. + , ((modMask .|. shiftMask, xK_space), + setLayout $ XMonad.layoutHook conf) + + -- Resize viewed windows to the correct size. + , ((modMask, xK_n), + refresh) + + -- Move focus to the next window. + , ((modMask, xK_Tab), + windows W.focusDown) + + -- Move focus to the next window. + , ((modMask, xK_j), + windows W.focusDown) + + -- Move focus to the previous window. + , ((modMask, xK_k), + windows W.focusUp ) + + -- Move focus to the master window. + , ((modMask, xK_m), + windows W.focusMaster ) + + -- Swap the focused window and the master window. + , ((modMask, xK_Return), + windows W.swapMaster) + + -- Swap the focused window with the next window. + , ((modMask .|. shiftMask, xK_j), + windows W.swapDown ) + + -- Swap the focused window with the previous window. + , ((modMask .|. shiftMask, xK_k), + windows W.swapUp ) + + -- Shrink the master area. + , ((modMask, xK_h), + sendMessage Shrink) + + -- Expand the master area. + , ((modMask, xK_l), + sendMessage Expand) + + -- Push window back into tiling. + , ((modMask, xK_t), + withFocused $ windows . W.sink) + + -- Increment the number of windows in the master area. + , ((modMask, xK_comma), + sendMessage (IncMasterN 1)) + + -- Decrement the number of windows in the master area. + , ((modMask, xK_period), + sendMessage (IncMasterN (-1))) + + -- Toggle the status bar gap. + -- TODO: update this binding with avoidStruts, ((modMask, xK_b), + + -- Quit xmonad. + , ((modMask .|. shiftMask, xK_c), + io (exitWith ExitSuccess)) + + -- Restart xmonad. + , ((modMask, xK_q), + restart "xmonad" True) + ] + ++ + + -- mod-[1..9], Switch to workspace N + -- mod-shift-[1..9], Move client to workspace N + [((m .|. modMask, k), windows $ f i) + | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9] + , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] + ++ + + -- mod-{w,e,r}, Switch to physical/Xinerama screens 1, 2, or 3 + -- mod-shift-{w,e,r}, Move client to screen 1, 2, or 3 + [((m .|. modMask, key), screenWorkspace sc >>= flip whenJust (windows . f)) + | (key, sc) <- zip [xK_w, xK_e, xK_r] [0..] + , (f, m) <- [(W.view, 0), (W.shift, shiftMask)]] + +------------------------------------------------------------------------ +-- Mouse bindings +-- +-- Focus rules +-- True if your focus should follow your mouse cursor. +myFocusFollowsMouse :: Bool +myFocusFollowsMouse = True + +myMouseBindings (XConfig {XMonad.modMask = modMask}) = M.fromList $ + [ + -- mod-button1, Set the window to floating mode and move by dragging + ((modMask, button1), + (\w -> focus w >> mouseMoveWindow w)) + + -- mod-button2, Raise the window to the top of the stack + , ((modMask, button2), + (\w -> focus w >> windows W.swapMaster)) + + -- mod-button3, Set the window to floating mode and resize by dragging + , ((modMask, button3), + (\w -> focus w >> mouseResizeWindow w)) + + -- you may also bind events to the mouse scroll wheel (button4 and button5) + ] + + +------------------------------------------------------------------------ +-- Status bars and logging +-- Perform an arbitrary action on each internal state change or X event. +-- See the 'DynamicLog' extension for examples. +-- +-- To emulate dwm's status bar +-- +-- > logHook = dynamicLogDzen +-- + + +------------------------------------------------------------------------ +-- Startup hook +-- Perform an arbitrary action each time xmonad starts or is restarted +-- with mod-q. Used by, e.g., XMonad.Layout.PerWorkspace to initialize +-- per-workspace layout choices. +-- +-- By default, do nothing. +myStartupHook = + spawn "compton -f" + + +------------------------------------------------------------------------ +-- Run xmonad with all the defaults we set up. +-- +main = do + xmproc <- spawnPipe "xmobar ~/.xmonad/xmobar.hs" + xmonad $ defaults { + logHook = dynamicLogWithPP $ xmobarPP { + ppOutput = hPutStrLn xmproc + , ppTitle = xmobarColor xmobarTitleColor "" . shorten 100 + , ppCurrent = xmobarColor xmobarCurrentWorkspaceColor "" + , ppSep = " " + } + , manageHook = manageDocks <+> myManageHook + , startupHook = setWMName "LG3D" <+> myStartupHook + } + + +------------------------------------------------------------------------ +-- Combine it all together +-- A structure containing your configuration settings, overriding +-- fields in the default config. Any you don't override, will +-- use the defaults defined in xmonad/XMonad/Config.hs +-- +-- No need to modify this. +-- +defaults = def { + -- simple stuff + terminal = myTerminal, + focusFollowsMouse = myFocusFollowsMouse, + borderWidth = myBorderWidth, + modMask = myModMask, + workspaces = myWorkspaces, + normalBorderColor = myNormalBorderColor, + focusedBorderColor = myFocusedBorderColor, + + -- key bindings + keys = myKeys, + mouseBindings = myMouseBindings, + + -- hooks, layouts + layoutHook = smartBorders $ myLayout, + manageHook = myManageHook, + startupHook = myStartupHook +}