Xmonad up key

I recently started using xmonad and I have an issue that I cannot manage to resolve. For some reason, when I use xmonad, my up arrow key no longer functions. It worked fine when I was originally using xmonad with KDM, but I've since started using just .xinitrc to load it. I know it isn't a keyboard problem because the key works when I'm not in X and xev recognizes the keypress when I am in X. If anyone has any suggestions, they would be greatly appreciated.
-Andrew

Once, my xmonad-file didn't work because the "keyboard language" was wrong.
Maybe, you want to try that:
Set the right layout (same as KDM used) with setxkbmap start your xmonad again (both manually inside your shell). If it works, you can put setxkbmap in .xinitrc or change rc.conf.

Similar Messages

  • XMonad + win key as mod + openOffice - fails to work

    Hey,
    Just installed xMonad and was trying it out. Config file has the windows key set up as the mod key. I started open office and then the mod key, the windows key that is, was no longer being recognized.
    Any ideas to avoid this?
    Aditya

    aditya.shevade wrote:
    Hey,
    Just installed xMonad and was trying it out. Config file has the windows key set up as the mod key. I started open office and then the mod key, the windows key that is, was no longer being recognized.
    Any ideas to avoid this?
    Aditya
    There is some problems with OOo 'stealing' keys from xmonad. I don't remember if anyone have found away around this yet.

  • Xmonad questions

    so i got so tired of awesome constantly breaking my config that i switched to xmonad. ive got pretty much everything working the way i like it. just a few things though..
    1.)  does anyone have a battery script for xmobar? ive searched and cant find anything
    2.)  i want to be able to click my wifi applet in xmobar and it launch urxvt -e wicd-curses. possible?
    3.)  in awesome, i had a function to send an application to workspace X or to take it to workspace X with me. is there anyway i can do that with xmonad? heres the lua code for a frame of reference:
    -- Take client to tag i
    awful.key({ modkey, "Control" }, i,
    function ()
    if client.focus then
    if tags[client.focus.screen][i] then
    awful.client.movetotag(tags[client.focus.screen][i])
    local screen = mouse.screen
    if tags[screen][i] then
    awful.tag.viewonly(tags[screen][i])
    end
    end
    end
    end),
    -- Send client to tag i
    awful.key({ modkey, "Shift" }, i,
    function ()
    if client.focus and tags[client.focus.screen][i] then
    awful.client.movetotag(tags[client.focus.screen][i])
    end
    end),
    thanks.

    vogt wrote:1) one of the default plugins for xmobar is battery...
    PEBCAK
    vogt wrote:2) xmobar doesn't provide any ability to respond to clicks afaik. Perhaps it wouldn't be so difficult to add such a feature?
    do you know if it supports a popup feature like awesome's naughty?
    vogt wrote:
    3) The default keybindings M-S-n where n is 1...9 seem to do the first part.
    For the second part, you can accomplish this with the following codes, I've also included some stuff for including it with the rest of your config... which probably needs to be adapted:
    -- imports you might have to add
    import qualified XMonad.StackSet as W
    import Data.Monoid
    import qualified Data.Map as M
    viewShift :: WorkspaceId -> X ()
    viewShift ws = windows $ W.greedyView ws . W.shift ws
    And then to set up the keybindings for all 1..9 keys the following list comprehension (here you hold you mod4 and controlMask):
    shiftFollowKeys :: XConfig Layout -> M.Map (KeyMask,KeySym) (X ())
    shiftFollowKeys conf = M.fromList [ ((modMask conf .|. controlMask, k), viewShift $ show n)
    | (k,n) <- zip [xK_0 .. xK_9] [1..9] ]
    Then you've specified additional keybindings somewhere and you can just append the shiftFollowKeys using the ++ operator, otherwise you can do something like:
    main :: IO ()
    main = xmonad $ defaultConfig { keys = mconcat [shiftFollowKeys,myKeys,keys defaultConfig] }
    Depending if you've defined myKeys and what type it has (that is, if it is a M.Map or a list), you can leave that one out, or you may have to apply a M.fromList somewhere, so do ask if you're having trouble with that part.
    thanks a lot. ill try and give it a shot.

  • Has anyone seen xmonad crashes the last few days? [SOLVED]

    I've seen a strange problem three or four times in the last few days where xmonad (0.9 and darcs) seems to be quietly crashing. Things will seem fine with it for a while, then after some point, I can no longer see launched programs (executed through xbindkeys) and xmonad's key bindings seem to fail. I can change TTYs and there's no abnormal CPU or memory usage, nor are there any errors in xmonan.errors. I can see that programs are being started from the other TTY; they're just not being shown on screen. Other than the changes in xmonad and supporting libraries, the only thing new for me is xmobar. It seems to happen if the machine sits unused for a while. Is anyone else seeing this?

    flamelab wrote:In 3 and 6, the same component is ... gvim. Is it possible that gvim causes any problem ?
    No, gvim's fine. I can reproduce it 100% of the time now with uzbl_tabbed. It's somewhat unstable and needs to have the files under /tmp deleted on other system sometimes. Hmmm?
    --EDIT--
    If anyone is still reading this, it only happens in xmonad. As well, after the machine goes to sleep and comes back, xmonad's Go {U,L,R,D} stops working properly if there are three windows open. Gads!

  • What is the Fn key in xmonad keycodes?

    I would like to assign some keyboard shortcuts with the Fn key right in xmonad.hs, but I don't know which one is the Fn key.
    This website has the xmonad keycodes I'm talking about: http://www.haskell.org/haskellwiki/Xmonad/Key_codes
    I know my actual keycodes (the number ones), but I don't know how to assign them to run commands. s1 and s2 are buttons on my laptop, mouse search button is a button on my mouse (that should be for windows search, but I don't care what I set it to, really).
    s1 = keycode 159
    s2 = keycode 151
    Mute (Fn + F2) = keycode 160
    Lower Volume (Fn + F3) = keycode 174
    Raise Volume (Fn + F4) = keycode 176
    Brightness Down (Fn + F5)= keycode 101
    Brightness Up (Fn + F6) = keycode 212
    Mouse Search Button = keycode 229
    Sleep (Fn + F12) = keycode 165
    This is where in my xmonad.hs I want to set my shortcuts (because I can just assign them to run commands):
    } `additionalKeys`
    [ ((mod1Mask .|. controlMask, xK_End), spawn "sudo shutdown -h now")
    , ((controlMask, xK_Print), spawn "scrot -s")
    , ((0, xK_Print), spawn "scrot")
    Notice the "mod1Mask", "xK_Print", etc. What I want to know is which one (out of all of those on the website above) is for the Fn key or if there is one "xK_Print", etc. thing for Fn combinations, such as Fn + F12.
    I know that probably sounded confusing, but hopefully someone can help. I would really prefer doing this in xmonad.hs (and NOT use keytouch; keytouch doesn't seem to like my laptop for some reason). All I need to know is the Fn key or if I can bind the three digit keycodes in xmonad.hs to run commands.

    Usually the Fn is not directly seen by the OS. It is a key that is present to give an hardware emulation of some keys. In my laptop Fn+I emulate the 5 key in the keypad; while pressing this combinaison the OS simply see that i have pressed the 5 key on the numpad without seing that I have pressed a combinaison of keys.
    You can see the keycode of keys with the xev command (under X). To see directly what the kernel see; you can use the showkey command in a console (a real console not an xterm).

  • Xmonad, lock the mod key to simulate modal behavior.

    Hi,  I just had an idea that I would like to try out, however I can't figure out a good way to go about implementing it.
    I'm currently using xmonad as my wm, and I have myModMask set to the Super_L key.  what I would like to do is have this key lock in a similar fashion to the caps-lock key so that I can achieve a vim like modal behavior for my desktop environment.  basically I spend a lot of time moving windows around etc. and I'm tired of having my pinky tied up during these moves, so I thought I'd try this out.
    xmodmap doesn't seem to allow me to do what I need, so I'm thinking I might be able to do something with my xmonad.hs... any ideas?

    Hi!
    I haven't had the patience to start learning haskell... in the mean time I hacked this together;
    http://pastebin.com/3BDTier2
    There's a "recursive submap" called myGeneralSubMap. It works for the basic stuff (moving windows around and stuff), but spawning stuff is broken/ugly; it'll spawn the command only once you *leave* the recursive submap.
    Does anyone have an idea on how to fix that?
    What bothers me with this is that the list of my keybindings is doubled; once for the normal keys, and once for the submap. What would be the elegant haskell way of using one list for both instances?
    Last edited by wonko7 (2011-12-29 21:46:40)

  • [disregard]Xmonad toggling media keys.

    Hi, I've recently installed the moc music player, and I was wondering how to toggle keybindings in xmonad.hs?
    basically, instead of having seperate keys assigned to the mocp server commands "mocp -P" (pause) and "mocp -U" (resume) I would like to have both of these commands assigned to my media pause key, and of course have my pause key toggle between these two commands.
    any idea how I would go about this?
    Last edited by Cyrusm (2010-02-15 05:37:25)

    Disregard, I found a solution,
    man mocp :facepalm:
    Last edited by Cyrusm (2010-02-15 04:50:50)

  • [XMonad/X11] Fn + key != number

    I just recently installed XMonad on my Asus UL30 laptop and I'm still working on getting it to work properly.
    The problem I'm having now is as follows: My laptop's Fn+key combinations mostly work, except for the numbers. Fn+P does produce "*", but Fn+O does not produce a "6".
    I am using HAL for keyboard configuration.
    Excerpt from my xorg.conf:
    Section "InputDevice"
    Identifier "Keyboard0"
    Driver "kbd"
    Option "CoreKeyboard"
    Option "XkbRules" "xorg"
    Option "XkbModel" "asus_laptop"
    Option "XkbLayout" "cz"
    Option "XkbVariant "bksl"
    EndSection
    Thanks for your help.
    Last edited by Arthenik (2010-04-03 11:45:05)

    Unfortunately my old Mini does not have wireless capability. So I could not test the keyboard.
    I did however find two preferences files. I suggest you find them and trash them.
    Disconnect the keyboard first. Then find the two .plist files. They are:
    com.apple.KeyboardViewerServer.plist - this is in Users / yourself / Library / Preferences.
    The other is: com.apple.keyboardtype.plist - this is in Library (root level) / Preferences.
    After trashing both these, it's a good idea to restart the computer, and then once again pair the keyboard.

  • [Solved] Binding script to key's combination Xmonad.

    Hello.
    I treid sh /path/to/script , /path/to/script /script-name but none of them work.
    Anyone know how to do that
    BTW. I love Xmonad
    Strange after quit X it's work's (sh /path/to/script)
    Last edited by SpeedVin (2009-08-20 20:32:22)

    The scripts by mojlac024 replaces compiz by metacity when compiz is running, but when metacity is running it doesn't bring compiz back.
    How to incorporate that test:
    dbus-send --print-reply --type=method_call --dest=org.freedesktop.compiz /org/freedesktop/compiz/dbus/screen0 org.freedesktop.compiz.list | wc -l
    into the script?
    PS.:
    When compiz is running, it prints 1. But when compiz is not running, it prints:
    Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.compiz was not provided by any .service files
    0
    So a simple logical test of "is this 0 or not?" won't work, I'm afraid.
    Last edited by warnec (2010-06-23 17:01:44)

  • Xmonad.hs file: I need a template, but the official one gives errors

    I just installed Xmonad and I am LOVING it, but I need some help setting up an xmonad.hs file. I created one in ~/.xmonad/xmonad.hs and looked for a well-commented template since I don't know any Haskell (or any programming language, for that matter). This is the one I copied to the file:
    http://www.haskell.org/haskellwiki/Xmon … _xmonad.hs
    Which gives:
    -- xmonad example config file.
    -- A template showing all available configuration hooks,
    -- and how to override the defaults in your own xmonad.hs conf file.
    -- Normally, you'd only override those defaults you care about.
    import XMonad
    import System.Exit
    import qualified XMonad.StackSet as W
    import qualified Data.Map as M
    -- The preferred terminal program, which is used in a binding below and by
    -- certain contrib modules.
    myTerminal = "xterm"
    -- Width of the window border in pixels.
    myBorderWidth = 1
    -- 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 = mod1Mask
    -- The mask for the numlock key. Numlock status is "masked" from the
    -- current modifier status, so the keybindings will work with numlock on or
    -- off. You may need to change this on some systems.
    -- You can find the numlock modifier by running "xmodmap" and looking for a
    -- modifier with Num_Lock bound to it:
    -- > $ xmodmap | grep Num
    -- > mod2 Num_Lock (0x4d)
    -- Set numlockMask = 0 if you don't have a numlock key, or want to treat
    -- numlock status separately.
    myNumlockMask = mod2Mask
    -- The default number of workspaces (virtual screens) and their names.
    -- By default we use numeric strings, but any string may be used as a
    -- workspace name. The number of workspaces is determined by the length
    -- of this list.
    -- A tagging example:
    -- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
    myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
    -- Border colors for unfocused and focused windows, respectively.
    myNormalBorderColor = "#dddddd"
    myFocusedBorderColor = "#ff0000"
    -- Default offset of drawable screen boundaries from each physical
    -- screen. Anything non-zero here will leave a gap of that many pixels
    -- on the given edge, on the that screen. A useful gap at top of screen
    -- for a menu bar (e.g. 15)
    -- An example, to set a top gap on monitor 1, and a gap on the bottom of
    -- monitor 2, you'd use a list of geometries like so:
    -- > defaultGaps = [(18,0,0,0),(0,18,0,0)] -- 2 gaps on 2 monitors
    -- Fields are: top, bottom, left, right.
    myDefaultGaps = [(0,0,0,0)]
    -- Key bindings. Add, modify or remove key bindings here.
    myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
    -- launch a terminal
    [ ((modMask .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
    -- launch dmenu
    , ((modMask, xK_p ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
    -- launch gmrun
    , ((modMask .|. shiftMask, xK_p ), spawn "gmrun")
    -- close focused window
    , ((modMask .|. shiftMask, xK_c ), kill)
    -- Rotate 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))
    -- Deincrement the number of windows in the master area
    , ((modMask , xK_period), sendMessage (IncMasterN (-1)))
    -- toggle the status bar gap
    , ((modMask , xK_b ),
    modifyGap (\i n -> let x = (XMonad.defaultGaps conf ++ repeat (0,0,0,0)) !! i
    in if n == x then (0,0,0,0) else x))
    -- Quit xmonad
    , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
    -- Restart xmonad
    , ((modMask , xK_q ),
    broadcastMessage ReleaseResources >> 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.greedyView, 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: default actions bound to mouse events
    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)
    -- 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 = tiled ||| Mirror tiled ||| Full
    where
    -- default tiling algorithm partitions the screen into two panes
    tiled = Tall nmaster delta ratio
    -- The default number of windows in the master pane
    nmaster = 1
    -- Default proportion of screen occupied by master pane
    ratio = 1/2
    -- Percent of screen to increment by when resizing panes
    delta = 3/100
    -- 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 =? "MPlayer" --> doFloat
    , className =? "Gimp" --> doFloat
    , resource =? "desktop_window" --> doIgnore
    , resource =? "kdesktop" --> doIgnore ]
    -- Whether focus follows the mouse pointer.
    myFocusFollowsMouse :: Bool
    myFocusFollowsMouse = True
    -- 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
    myLogHook = return ()
    -- Now run xmonad with all the defaults we set up.
    -- Run xmonad with the settings you specify. No need to modify this.
    main = xmonad defaults
    -- 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 = defaultConfig {
    -- simple stuff
    terminal = myTerminal,
    focusFollowsMouse = myFocusFollowsMouse,
    borderWidth = myBorderWidth,
    modMask = myModMask,
    numlockMask = myNumlockMask,
    workspaces = myWorkspaces,
    normalBorderColor = myNormalBorderColor,
    focusedBorderColor = myFocusedBorderColor,
    defaultGaps = myDefaultGaps,
    -- key bindings
    keys = myKeys,
    mouseBindings = myMouseBindings,
    -- hooks, layouts
    layoutHook = myLayout,
    manageHook = myManageHook,
    logHook = myLogHook
    So I copied all this into my new xmonad.hs file and then restarted xmonad with mod+q, but a window popped up giving me this error:
    Error detected while loading xmonad configuration file: /home/agi/.xmonad/xmonad.hs
    on the commandline:
    Warning: -no-recomp is deprecated: Use -fforce-recomp instead
    xmonad.hs:141:10: Not in scope: `modifyGap'
    xmonad.hs:141:38: Not in scope: `XMonad.defaultGaps'
    xmonad.hs:273:8: Not in scope: `defaultGaps'
    Please check the file for errors.
    I'm not exactly sure what any of this means. If someone could help me decipher this or, better yet, post a better (well-commented so I can understand it) default xmonad.hs file that I can use, that would be great.

    Alright! I've got xmonad almost set up! One major thing I still want to do is add some sort of pager-like display in the top left of xmobar. Just to show workspaces 1-9 and highlight the one I'm in (giving a preview of my windows or telling me which ones I have windows in would be great, but not absolutely necessary).
    I can't find anything (that I understand) online. Help?
    Here's my xmonad.hs:
    import XMonad
    import XMonad.Hooks.DynamicLog
    import XMonad.Hooks.ManageDocks
    import XMonad.Util.Run(spawnPipe)
    import XMonad.Util.EZConfig(additionalKeys)
    import System.IO
    myManageHook = composeAll
    [ className =? "Gimp" --> doFloat
    main = do
    xmproc <- spawnPipe "/path/to/xmobarbinary /home/jgoerzen/.xmobarrc"
    -- make sure to edit paths to xmobar and .xmobarrc to match your system.
    -- If xmobar is in your $PATH, with config ~/.xmobarrc you don't need the
    -- xmobar path or config file, use: xmproc <- spawnPipe "xmobar"
    xmonad $ defaultConfig
    { manageHook = manageDocks <+> manageHook defaultConfig
    , layoutHook = avoidStruts $ layoutHook defaultConfig
    , logHook = dynamicLogWithPP $ xmobarPP
    { ppOutput = hPutStrLn xmproc
    , ppTitle = xmobarColor "green" "" . shorten 50
    , modMask = mod1Mask
    } `additionalKeys`
    [ ((mod1Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock")
    , ((controlMask, xK_Print), spawn "scrot -s")
    , ((0, xK_Print), spawn "scrot")
    and here's my xmobarrc:
    Config { font = "-Misc-Fixed-Bold-R-Normal--13-120-75-75-C-70-ISO8859-1"
    , bgColor = "black"
    , fgColor = "grey"
    , position = TopW L 90
    , commands = [ Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10
    , Run Memory ["-t","Mem: <usedratio>%"] 10
    , Run Swap [] 10
    , Run Date "%a %b %_d %l:%M" "date" 10
    , Run StdinReader
    , sepChar = "%"
    , alignSep = "}{"
    , template = "%StdinReader% }{ %cpu% | %memory% * %swap% <fc=#ee9a00>%date%</fc> |"

  • Xmonad and Xmobar: avoidStruts no longer exposes Xmobar

    I've been using Xmonad with the same config for months now. I reinstalled Arch recently, and ever since then avoidStruts no longer keeps Xmobar from being hidden behind windows.
    I have installed the xmonad and xmonad-contrib packages; my config compiles without errors. I'm at a loss here because I can't identify any changes that may have been made to either of the aforementioned packages that might cause this issue.
    xmonad.hs
    import XMonad
    import Data.Monoid
    import Data.Ratio ((%))
    import System.Exit
    import XMonad.Hooks.EwmhDesktops
    import XMonad.Hooks.DynamicLog
    import XMonad.Hooks.ManageDocks
    import XMonad.Hooks.UrgencyHook
    import XMonad.Layout.NoBorders
    import XMonad.Layout.Named
    import XMonad.Layout.Grid
    import XMonad.Layout.IM
    import XMonad.Util.Run(spawnPipe)
    import System.IO
    import qualified XMonad.StackSet as W
    import qualified Data.Map as M
    -- The preferred terminal program, which is used in a binding below and by
    -- certain contrib modules.
    myTerminal = "urxvt"
    -- Whether focus follows the mouse pointer.
    myFocusFollowsMouse :: Bool
    myFocusFollowsMouse = True
    -- Width of the window border in pixels.
    myBorderWidth = 2
    -- 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
    -- The default number of workspaces (virtual screens) and their names.
    -- By default we use numeric strings, but any string may be used as a
    -- workspace name. The number of workspaces is determined by the length
    -- of this list.
    -- A tagging example:
    -- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
    myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
    -- Border colors for unfocused and focused windows, respectively.
    myNormalBorderColor = "#404040"
    -- myFocusedBorderColor = "#0080ff"
    myFocusedBorderColor = "#ff0000"
    -- Key bindings. Add, modify or remove key bindings here.
    myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
    -- launch a terminal
    [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
    -- launch dmenu
    , ((modm, xK_p ), spawn "dmenu_run")
    -- launch gmrun
    , ((modm .|. shiftMask, xK_p ), spawn "gmrun")
    -- close focused window
    , ((modm .|. shiftMask, xK_c ), kill)
    -- close focused window (2)
    , ((modm, xK_z ), kill)
    -- close focused window (3)
    , ((modm, xK_Escape), kill)
    -- Rotate through the available layout algorithms
    , ((modm, xK_space ), sendMessage NextLayout)
    -- Reset the layouts on the current workspace to default
    , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
    -- Resize viewed windows to the correct size
    , ((modm, xK_n ), refresh)
    -- Move focus to the next window
    , ((modm, xK_Tab ), windows W.focusDown)
    -- Move focus to the next window
    , ((modm, xK_j ), windows W.focusDown)
    -- Move focus to the previous window
    , ((modm, xK_k ), windows W.focusUp )
    -- Move focus to the master window
    , ((modm, xK_m ), windows W.focusMaster )
    -- Swap the focused window and the master window
    , ((modm, xK_Return), windows W.swapMaster)
    -- Swap the focused window with the next window
    , ((modm .|. shiftMask, xK_j ), windows W.swapDown )
    -- Swap the focused window with the previous window
    , ((modm .|. shiftMask, xK_k ), windows W.swapUp )
    -- Shrink the master area
    , ((modm, xK_h ), sendMessage Shrink)
    -- Expand the master area
    , ((modm, xK_l ), sendMessage Expand)
    -- Push window back into tiling
    , ((modm, xK_t ), withFocused $ windows . W.sink)
    -- Increment the number of windows in the master area
    , ((modm , xK_comma ), sendMessage (IncMasterN 1))
    -- Deincrement the number of windows in the master area
    , ((modm , xK_period), sendMessage (IncMasterN (-1)))
    -- Toggle the status bar gap
    -- Use this binding with avoidStruts from Hooks.ManageDocks.
    -- See also the statusBar function from Hooks.DynamicLog.
    -- , ((modm , xK_b ), sendMessage ToggleStruts)
    -- Quit xmonad
    , ((modm .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
    -- Restart xmonad
    , ((modm , xK_q ), spawn "xmonad --recompile; xmonad --restart")
    -- Start Opera
    , ((modm .|. shiftMask, xK_i ), spawn "chromium")
    -- Start Thunar
    , ((modm .|. shiftMask, xK_f ), spawn "pcmanfm")
    -- Start networking gui
    , ((modm .|. shiftMask, xK_o ), spawn "wicd-gtk --no-tray")
    -- Video Settings
    , ((modm .|. shiftMask, xK_v ), spawn "nvidia-settings")
    ++
    -- mod-[1..9], Switch to workspace N
    -- mod-shift-[1..9], Move client to workspace N
    [((m .|. modm, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
    , (f, m) <- [(W.greedyView, 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 .|. modm, 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: default actions bound to mouse events
    myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList $
    -- mod-button1, Set the window to floating mode and move by dragging
    [ ((modm, button1), (\w -> focus w >> mouseMoveWindow w
    >> windows W.shiftMaster))
    -- mod-button2, Raise the window to the top of the stack
    , ((modm, button2), (\w -> focus w >> windows W.shiftMaster))
    -- mod-button3, Set the window to floating mode and resize by dragging
    , ((modm, button3), (\w -> focus w >> mouseResizeWindow w
    >> windows W.shiftMaster))
    -- you may also bind events to the mouse scroll wheel (button4 and button5)
    -- 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 = tall ||| grid ||| full
    where
    -- default tiling algorithm partitions the screen into two panes
    tiled = Tall nmaster delta ratio
    -- The default number of windows in the master pane
    nmaster = 1
    -- Default proportion of screen occupied by master pane
    ratio = 65/100
    -- Percent of screen to increment by when resizing panes
    delta = 5/100
    tall = named "Tall"
    $ avoidStruts
    $ Tall nmaster delta ratio
    grid = named "Grid"
    $ avoidStruts
    $ withIM (1%7) (Role "buddy_list") (GridRatio (4/3))
    full = named "Full"
    $ noBorders
    $ Full
    -- 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 =? "MPlayer" --> doFloat
    , className =? "Gimp" --> doFloat
    -- , className =? "Nm-connection-editor" --> doFloat
    -- , className =? "Wicd-client.py" --> doFloat
    , resource =? "desktop_window" --> doIgnore
    , resource =? "kdesktop" --> doIgnore
    -- , className =? "Xfce4-notifyd" --> doIgnore
    -- Event handling
    -- * EwmhDesktops users should change this to ewmhDesktopsEventHook
    -- Defines a custom handler function for X Events. The function should
    -- return (All True) if the default handler is to be run afterwards. To
    -- combine event hooks use mappend or mconcat from Data.Monoid.
    -- myEventHook = mempty
    myEventHook = fullscreenEventHook
    -- Status bars and logging
    -- Perform an arbitrary action on each internal state change or X event.
    -- See the 'XMonad.Hooks.DynamicLog' extension for examples.
    myLogHook h = dynamicLogWithPP $ xmobarPP
    { ppOutput = hPutStrLn h
    , ppTitle = xmobarColor "green" "" . shorten 200
    , ppUrgent = xmobarColor "white" "red" . wrap "" ""
    -- 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 = return ()
    -- Run xmonad with the settings you specify.
    main = do
    xmproc <- spawnPipe "/usr/bin/xmobar /home/chris/.xmonad/xmobarrc"
    xmonad $ withUrgencyHook NoUrgencyHook $ defaultConfig
    { terminal = myTerminal
    , focusFollowsMouse = myFocusFollowsMouse
    , borderWidth = myBorderWidth
    , modMask = myModMask
    , workspaces = myWorkspaces
    , normalBorderColor = myNormalBorderColor
    , focusedBorderColor = myFocusedBorderColor
    , keys = myKeys
    , mouseBindings = myMouseBindings
    , layoutHook = myLayout
    , manageHook = myManageHook
    , handleEventHook = myEventHook
    , logHook = myLogHook xmproc
    , startupHook = myStartupHook
    xmobarrc
    Config
    { font = "xft:ProFont:pixelsize=12"
    , bgColor = "#000000"
    -- used to make the bar appear correctly after Mod-q in older xmonad implementations (0.9.x)
    -- doesn't seem to do anything anymore (0.10, darcs)
    -- , lowerOnStart = False
    , commands =
    [ Run Wireless "wlan0" ["-t", "<essid> <quality>%"] 10
    , Run CommandReader "/home/chris/.xmonad/volume-listener.sh" "vol"
    , Run CommandReader "/home/chris/.xmonad/hdaps-listener.sh" "hdaps"
    , Run Battery
    [ "-t", "<acstatus> <left>%"
    , "-f", "AC/online"
    , "-o", "Bat"
    , "-O", "AC"
    20
    , Run Date "%a %b %_d %H:%M" "date" 10
    , Run StdinReader
    , sepChar = "%"
    , alignSep = "}{"
    , template = "%StdinReader% }{ <fc=#ff0000>%hdaps%</fc> %wlan0wi% Vol %vol% %battery% <fc=#ee9a00>%date%</fc> "
    Last edited by cheese, lol (2012-10-26 03:15:39)

    Downgrade to xmobar-0.15. See here.

  • Get VLC to do fullscreen float in Xmonad

    Hi,
    Short background: I have started to use XBMC for watching and organizing videos. Everything works great except playing the videos. I have a constant stutter about every 3-4 seconds and from time to time the picture freeze but the movie running in the background with sound OK, moving the mouse take away the freeze.
    I do not have thous problems with VLC. I have configured XBMC to use VLC to play videos.
    I have two monitors, one for movies. Using a Nvidia-card in TwinView.
    My problem is that when I start a movie VLC starts and XMONAD tiling it as it should. But of cause I do not want VLC and XBMC side by side on the monitor. I would like VLC fullscreen on top of XBMC.
    I have tried to solve it by using  XMonad.Hooks.ManageHelpers but no luck.
    My xmonad.hs looks like this.
    -- xmonad example config file.
    -- A template showing all available configuration hooks,
    -- and how to override the defaults in your own xmonad.hs conf file.
    -- Normally, you'd only override those defaults you care about.
    import XMonad
    import Data.Monoid
    import System.Exit
    import XMonad.Hooks.ManageDocks
    import XMonad.Util.Run(spawnPipe)
    import XMonad.Hooks.DynamicLog
    import System.IO
    import XMonad.Hooks.ManageHelpers
    import qualified XMonad.StackSet as W
    import qualified Data.Map as M
    main = do
    xmproc <- spawnPipe "/usr/bin/xmobar /home/christer/.xmonad/xmobarrc"
    xmonad defaults
    -- { manageHook = manageDocks <+> manageHook defaultConfig
    { manageHook = myManageHook
    , layoutHook = avoidStruts $ layoutHook defaultConfig
    , logHook = dynamicLogWithPP xmobarPP
    { ppOutput = hPutStrLn xmproc
    , ppTitle = xmobarColor "green" "" . shorten 100
    myManageHook = composeOne
    [ className =? "vlc" -?> doFullFloat
    , className =? "skype" -?> doFloat
    , resource =? "desktop_window" -?> doIgnore
    , resource =? "kdesktop" -?> doIgnore ]
    -- The preferred terminal program, which is used in a binding below and by
    -- certain contrib modules.
    -- myTerminal = "xterm"
    myTerminal = "urxvt"
    -- Whether focus follows the mouse pointer.
    myFocusFollowsMouse :: Bool
    myFocusFollowsMouse = True
    -- Width of the window border in pixels.
    myBorderWidth = 3
    -- 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
    -- The default number of workspaces (virtual screens) and their names.
    -- By default we use numeric strings, but any string may be used as a
    -- workspace name. The number of workspaces is determined by the length
    -- of this list.
    -- A tagging example:
    -- > workspaces = ["web", "irc", "code" ] ++ map show [4..9]
    myWorkspaces = ["1","2","3","4","5","6","7","8","9"]
    -- Border colors for unfocused and focused windows, respectively.
    -- myNormalBorderColor = "#dddddd"
    myNormalBorderColor = "#000000"
    myFocusedBorderColor = "#ff0000"
    -- Key bindings. Add, modify or remove key bindings here.
    myKeys conf@(XConfig {XMonad.modMask = modm}) = M.fromList $
    -- launch a terminal
    [ ((modm .|. shiftMask, xK_Return), spawn $ XMonad.terminal conf)
    -- launch dmenu
    , ((modm, xK_p ), spawn "dmenu_run -b")
    -- launch gmrun
    , ((modm .|. shiftMask, xK_p ), spawn "gmrun")
    -- close focused window
    , ((modm .|. shiftMask, xK_c ), kill)
    -- Rotate through the available layout algorithms
    , ((modm, xK_space ), sendMessage NextLayout)
    -- Reset the layouts on the current workspace to default
    , ((modm .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
    -- Resize viewed windows to the correct size
    , ((modm, xK_n ), refresh)
    -- Move focus to the next window
    , ((modm, xK_Tab ), windows W.focusDown)
    -- Move focus to the next window
    , ((modm, xK_j ), windows W.focusDown)
    -- Move focus to the previous window
    , ((modm, xK_k ), windows W.focusUp )
    -- Move focus to the master window
    , ((modm, xK_m ), windows W.focusMaster )
    -- Swap the focused window and the master window
    , ((modm, xK_Return), windows W.swapMaster)
    -- Swap the focused window with the next window
    , ((modm .|. shiftMask, xK_j ), windows W.swapDown )
    -- Swap the focused window with the previous window
    , ((modm .|. shiftMask, xK_k ), windows W.swapUp )
    -- Shrink the master area
    , ((modm, xK_h ), sendMessage Shrink)
    -- Expand the master area
    , ((modm, xK_l ), sendMessage Expand)
    -- Push window back into tiling
    , ((modm, xK_t ), withFocused $ windows . W.sink)
    -- Increment the number of windows in the master area
    , ((modm , xK_comma ), sendMessage (IncMasterN 1))
    -- Deincrement the number of windows in the master area
    , ((modm , xK_period), sendMessage (IncMasterN (-1)))
    -- Toggle the status bar gap
    -- Use this binding with avoidStruts from Hooks.ManageDocks.
    -- See also the statusBar function from Hooks.DynamicLog.
    -- , ((modm , xK_b ), sendMessage ToggleStruts)
    -- Quit xmonad
    , ((modm .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
    -- Restart xmonad
    , ((modm , xK_q ), spawn "xmonad --recompile; xmonad --restart")
    -- mod-[1..9], Switch to workspace N
    -- mod-shift-[1..9], Move client to workspace N
    [((m .|. modm, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
    , (f, m) <- [(W.greedyView, 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 .|. modm, 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: default actions bound to mouse events
    myMouseBindings (XConfig {XMonad.modMask = modm}) = M.fromList $
    -- mod-button1, Set the window to floating mode and move by dragging
    [ ((modm, button1), (\w -> focus w >> mouseMoveWindow w
    >> windows W.shiftMaster))
    -- mod-button2, Raise the window to the top of the stack
    , ((modm, button2), (\w -> focus w >> windows W.shiftMaster))
    -- mod-button3, Set the window to floating mode and resize by dragging
    , ((modm, button3), (\w -> focus w >> mouseResizeWindow w
    >> windows W.shiftMaster))
    -- you may also bind events to the mouse scroll wheel (button4 and button5)
    -- 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 = tiled ||| Mirror tiled ||| Full
    where
    -- default tiling algorithm partitions the screen into two panes
    tiled = Tall nmaster delta ratio
    -- The default number of windows in the master pane
    nmaster = 1
    -- Default proportion of screen occupied by master pane
    ratio = 1/4
    -- Percent of screen to increment by when resizing panes
    delta = 3/100
    -- 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.
    -- Event handling
    -- * EwmhDesktops users should change this to ewmhDesktopsEventHook
    -- Defines a custom handler function for X Events. The function should
    -- return (All True) if the default handler is to be run afterwards. To
    -- combine event hooks use mappend or mconcat from Data.Monoid.
    myEventHook = mempty
    -- Status bars and logging
    -- Perform an arbitrary action on each internal state change or X event.
    -- See the 'XMonad.Hooks.DynamicLog' extension for examples.
    myLogHook = return ()
    -- 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 = return ()
    -- Now run xmonad with all the defaults we set up.
    -- Run xmonad with the settings you specify. No need to modify this.
    -- main = xmonad defaults
    -- 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 = defaultConfig {
    -- 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 = myLayout,
    manageHook = myManageHook,
    handleEventHook = myEventHook,
    logHook = myLogHook,
    startupHook = myStartupHook
    Any idea what I missed?
    Best regards.
    Christer

    Try this, it works very well for me.
    import XMonad.Hooks.ManageHelpers (composeOne, isFullscreen, isDialog, doFullFloat, doCenterFloat)
    myManageHook = composeAll. concat $
    [ [ className =? c --> doCenterFloat| c <- floats]
    , [ resource =? r --> doIgnore | r <- ignore]
    , [ resource =? "gecko" --> doF (W.shift "net") ]
    , [ isFullscreen --> doFullFloat]
    , [ isDialog --> doCenterFloat]]
    where floats = ["sdlpal", "MPlayer", "Gimp", "qemu-system-x86_64", "Gnome-typing-monitor", "Vlc", "Dia", "DDMS", "Audacious", "Wine"]
    ignore = []
    myLayout = tall ||| Mirror tall||| Full ||| tab ||| float
    where
    tall = named "Tall" $ limitWindows 4 $ minimize $ Tall 1 (3/100) (1/2)
    tab = named "Tab" simpleTabbedBottom
    float = named "Float" simpleFloat
    main = do
    myStatusBarPipe <- spawnPipe myBar
    conkyBarProc <- spawnPipe conkyBar
    trayproc <- spawnPipe myTrayer
    xmonad $ ewmh $ withUrgencyHook NoUrgencyHook $ defaultConfig {
    terminal = "urxvt"
    , manageHook = manageDocks <+> myManageHook <+> manageHook defaultConfig
    Last edited by helloworld1 (2012-08-14 05:20:56)

  • System encryption using LUKS and GPG encrypted keys for arch linux

    Update: As of 2012-03-28, arch changed from gnupg 1.4 to 2.x which uses pinentry for the password dialog. The "etwo" hook described here doesn't work with gnupg 2. Either use the openssl hook below or use a statically compiled version of gnupg 1.4.
    Update: As of 2012-12-19, the mkinitcpio is not called during boot, unless the "install" file for the hook contains "add_runscript". This resulted in an unbootable system for me. Also, the method name was changed from install () to build ().
    Update: 2013-01-13: Updated the hook files using the corrections by Deth.
    Note: This guide is a bit dated now, in particular the arch installation might be different now. But essentially, the approach stays the same. Please also take a look at the posts further down, specifically the alternative hooks that use openssl.
    I always wanted to set up a fully encrypted arch linux server that uses gpg encrypted keyfiles on an external usb stick and luks for root filesystem encryption. I already did it once in gentoo using this guide. For arch, I had to play alot with initcpio hooks and after one day of experimentation, I finally got it working. I wrote a little guide for myself which I'm going to share here for anyone that might be interested. There might be better or easier ways, like I said this is just how I did it. I hope it might help someone else. Constructive feedback is always welcome
    Intro
    Using arch linux mkinitcpio's encrypt hook, one can easily use encrypted root partitions with LUKS. It's also possible to use key files stored on an external drive, like an usb stick. However, if someone steals your usb stick, he can just copy the key and potentially access the system. I wanted to have a little extra security by additionally encrypting the key file with gpg using a symmetric cipher and a passphrase.
    Since the encrypt hook doesn't support this scenario, I created a modifed hook called “etwo” (silly name I know, it was the first thing that came to my mind). It will simply look if the key file has the extension .gpg and, if yes, use gpg to decrypt it, then pipe the result into cryptsetup.
    Conventions
    In this short guide, I use the following disk/partition names:
    /dev/sda: is the hard disk that will contain an encrypted swap (/dev/sda1), /var (/dev/sda2) and root (/dev/sda3) partition.
    /dev/sdb is the usb stick that will contain the gpg encrypted luks keys, the kernel and grub. It will have one partition /dev/sdb1 formatted with ext2.
    /dev/mapper/root, /dev/mapper/swap and /dev/mapper/var will be the encrypted devices.
    Credits
    Thanks to the authors of SECURITY_System_Encryption_DM-Crypt_with_LUKS (gentoo wiki), System Encryption with LUKS (arch wiki), mkinitcpio (arch wiki) and Early Userspace in Arch Linux (/dev/brain0 blog)!
    Guide
    1. Boot the arch live cd
    I had to use a newer testing version, because the 2010.05 cd came with a broken gpg. You can download one here: http://releng.archlinux.org/isos/. I chose the “core“ version. Go ahead and boot the live cd, but don't start the setup yet.
    2. Set keymap
    Use km to set your keymap. This is important for non-qwerty keyboards to avoid suprises with passphrases...
    3. Wipe your discs
    ATTENTION: this will DELETE everything on /dev/sda and /dev/sdb forever! Do not blame me for any lost data!
    Before encrypting the hard disc, it has to be completely wiped and overwritten with random data. I used shred for this. Others use badblocks or dd with /dev/urandom. Either way, this will take a long time, depending on the size of your disc. I also wiped my usb stick just to be sure.
    shred -v /dev/sda
    shred -v /dev/sdb
    4. Partitioning
    Fire up fdisk and create the following partitions:
    /dev/sda1, type linux swap.
    /dev/sda2: type linux
    /dev/sda3: type linux
    /dev/sdb1, type linux
    Of course you can choose a different layout, this is just how I did it. Keep in mind that only the root filesystem will be decrypted by the initcpio. The rest will be decypted during normal init boot using /etc/crypttab, the keys being somewhere on the root filesystem.
    5. Format  and mount the usb stick
    Create an ext2 filesystem on /dev/sdb1:
    mkfs.ext2 /dev/sdb1
    mkdir /root/usb
    mount /dev/sdb1 /root/usb
    cd /root/usb # this will be our working directory for now.
    Do not mount anything to /mnt, because the arch installer will use that directory later to mount the encrypted root filesystem.
    6. Configure the network (if not already done automatically)
    ifconfig eth0 192.168.0.2 netmask 255.255.255.0
    route add default gw 192.168.0.1
    echo "nameserver 192.168.0.1" >> /etc/resolv.conf
    (this is just an example, your mileage may vary)
    7. Install gnupg
    pacman -Sy
    pacman -S gnupg
    Verify that gnupg works by launching gpg.
    8. Create the keys
    Just to be sure, make sure swap is off:
    cat /proc/swaps
    should return no entries.
    Create gpg encrypted keys (remember, we're still in our working dir /root/usb):
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > root.gpg
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > var.gpg
    Choose a strong password!!
    Don't do this in two steps, e.g don't do dd to a file and then gpg on that file. The key should never be stored in plain text on an unencrypted device, except if that device is wiped on system restart (ramfs)!
    Note that the default cipher for gpg is cast5, I just chose to use a different one.
    9. Create the encrypted devices with cryptsetup
    Create encrypted swap:
    cryptsetup -c aes-cbc-essiv:sha256 -s 256 -h whirlpool -d /dev/urandom create swap /dev/sda1
    You should see /dev/mapper/swap now. Don't format nor turn it on for now. This will be done by the arch installer.
    Important: From the Cryptsetup 1.1.2 Release notes:
    Cryptsetup can accept passphrase on stdin (standard input). Handling of new line (\n) character is defined by input specification:
        if keyfile is specified as "-" (using --key-file=- or by positional argument in luksFormat and luksAddKey, like cat file | cryptsetup --key-file=- <action> ), input is processed
          as normal binary file and no new line is interpreted.
        if there is no key file specification (with default input from stdin pipe like echo passphrase | cryptsetup <action> ) input is processed as input from terminal, reading will
          stop after new line is detected.
    If I understand this correctly, since the randomly generated key can contain a newline early on, piping the key into cryptsetup without specifying --key-file=- could result in a big part of the key to be ignored by cryptsetup. Example: if the random key was "foo\nandsomemorebaratheendofthekey", piping it directly into cryptsetup without --key-file=- would result in cryptsetup using only "foo" as key which would have big security implications. We should therefor ALWAYS pipe the key into cryptsetup using --key-file=- which ignores newlines.
    gpg -q -d root.gpg 2>/dev/null | cryptsetup -v -–key-file=- -c aes-cbc-essiv:sha256 -s 256 -h whirlpool luksFormat /dev/sda3
    gpg -q -d var.gpg 2>/dev/null | cryptsetup -v –-key-file=- -c aes-cbc-essiv:sha256 -s 256 -h whirlpool -v luksFormat /dev/sda2
    Check for any errors.
    10. Open the luks devices
    gpg -d root.gpg 2>/dev/null | cryptsetup -v –-key-file=- luksOpen /dev/sda3 root
    gpg -d var.gpg 2>/dev/null | cryptsetup -v –-key-file=- luksOpen /dev/sda2 var
    If you see /dev/mapper/root and /dev/mapper/var now, everything is ok.
    11. Start the installer /arch/setup
    Follow steps 1 to 3.
    At step 4 (Prepare hard drive(s), select “3 – Manually Configure block devices, filesystems and mountpoints. Choose /dev/sdb1 (the usb stick) as /boot, /dev/mapper/swap for swap, /dev/mapper/root for / and /dev/mapper/var for /var.
    Format all drives (choose “yes” when asked “do you want to have this filesystem (re)created”) EXCEPT for /dev/sdb1, choose “no”. Choose the correct filesystem for /dev/sdb1, ext2 in my case. Use swap for /dev/mapper/swap. For the rest, I chose ext4.
    Select DONE to start formatting.
    At step 5 (Select packages), select grub as boot loader. Select the base group. Add mkinitcpio.
    Start step 6 (Install packages).
    Go to step 7 (Configure System).
    By sure to set the correct KEYMAP, LOCALE and TIMEZONE in /etc/rc.conf.
    Edit /etc/fstab:
    /dev/mapper/root / ext4 defaults 0 1
    /dev/mapper/swap swap swap defaults 0 0
    /dev/mapper/var /var ext4 defaults 0 1
    # /dev/sdb1 /boot ext2 defaults 0 1
    Configure the rest normally. When you're done, setup will launch mkinitcpio. We'll manually launch this again later.
    Go to step 8 (install boot loader).
    Be sure to change the kernel line in menu.lst:
    kernel /vmlinuz26 root=/dev/mapper/root cryptdevice=/dev/sda3:root cryptkey=/dev/sdb1:ext2:/root.gpg
    Don't forget the :root suffix in cryptdevice!
    Also, my root line was set to (hd1,0). Had to change that to
    root (hd0,0)
    Install grub to /dev/sdb (the usb stick).
    Now, we can exit the installer.
    12. Install mkinitcpio with the etwo hook.
    Create /mnt/lib/initcpio/hooks/etwo:
    #!/usr/bin/ash
    run_hook() {
    /sbin/modprobe -a -q dm-crypt >/dev/null 2>&1
    if [ -e "/sys/class/misc/device-mapper" ]; then
    if [ ! -e "/dev/mapper/control" ]; then
    /bin/mknod "/dev/mapper/control" c $(cat /sys/class/misc/device-mapper/dev | sed 's|:| |')
    fi
    [ "${quiet}" = "y" ] && CSQUIET=">/dev/null"
    # Get keyfile if specified
    ckeyfile="/crypto_keyfile"
    usegpg="n"
    if [ "x${cryptkey}" != "x" ]; then
    ckdev="$(echo "${cryptkey}" | cut -d: -f1)"
    ckarg1="$(echo "${cryptkey}" | cut -d: -f2)"
    ckarg2="$(echo "${cryptkey}" | cut -d: -f3)"
    if poll_device "${ckdev}" ${rootdelay}; then
    case ${ckarg1} in
    *[!0-9]*)
    # Use a file on the device
    # ckarg1 is not numeric: ckarg1=filesystem, ckarg2=path
    if [ "${ckarg2#*.}" = "gpg" ]; then
    ckeyfile="${ckeyfile}.gpg"
    usegpg="y"
    fi
    mkdir /ckey
    mount -r -t ${ckarg1} ${ckdev} /ckey
    dd if=/ckey/${ckarg2} of=${ckeyfile} >/dev/null 2>&1
    umount /ckey
    # Read raw data from the block device
    # ckarg1 is numeric: ckarg1=offset, ckarg2=length
    dd if=${ckdev} of=${ckeyfile} bs=1 skip=${ckarg1} count=${ckarg2} >/dev/null 2>&1
    esac
    fi
    [ ! -f ${ckeyfile} ] && echo "Keyfile could not be opened. Reverting to passphrase."
    fi
    if [ -n "${cryptdevice}" ]; then
    DEPRECATED_CRYPT=0
    cryptdev="$(echo "${cryptdevice}" | cut -d: -f1)"
    cryptname="$(echo "${cryptdevice}" | cut -d: -f2)"
    else
    DEPRECATED_CRYPT=1
    cryptdev="${root}"
    cryptname="root"
    fi
    warn_deprecated() {
    echo "The syntax 'root=${root}' where '${root}' is an encrypted volume is deprecated"
    echo "Use 'cryptdevice=${root}:root root=/dev/mapper/root' instead."
    if poll_device "${cryptdev}" ${rootdelay}; then
    if /sbin/cryptsetup isLuks ${cryptdev} >/dev/null 2>&1; then
    [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
    dopassphrase=1
    # If keyfile exists, try to use that
    if [ -f ${ckeyfile} ]; then
    if [ "${usegpg}" = "y" ]; then
    # gpg tty fixup
    if [ -e /dev/tty ]; then mv /dev/tty /dev/tty.backup; fi
    cp -a /dev/console /dev/tty
    while [ ! -e /dev/mapper/${cryptname} ];
    do
    sleep 2
    /usr/bin/gpg -d "${ckeyfile}" 2>/dev/null | cryptsetup --key-file=- luksOpen ${cryptdev} ${cryptname} ${CSQUIET}
    dopassphrase=0
    done
    rm /dev/tty
    if [ -e /dev/tty.backup ]; then mv /dev/tty.backup /dev/tty; fi
    else
    if eval /sbin/cryptsetup --key-file ${ckeyfile} luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; then
    dopassphrase=0
    else
    echo "Invalid keyfile. Reverting to passphrase."
    fi
    fi
    fi
    # Ask for a passphrase
    if [ ${dopassphrase} -gt 0 ]; then
    echo ""
    echo "A password is required to access the ${cryptname} volume:"
    #loop until we get a real password
    while ! eval /sbin/cryptsetup luksOpen ${cryptdev} ${cryptname} ${CSQUIET}; do
    sleep 2;
    done
    fi
    if [ -e "/dev/mapper/${cryptname}" ]; then
    if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
    export root="/dev/mapper/root"
    fi
    else
    err "Password succeeded, but ${cryptname} creation failed, aborting..."
    exit 1
    fi
    elif [ -n "${crypto}" ]; then
    [ ${DEPRECATED_CRYPT} -eq 1 ] && warn_deprecated
    msg "Non-LUKS encrypted device found..."
    if [ $# -ne 5 ]; then
    err "Verify parameter format: crypto=hash:cipher:keysize:offset:skip"
    err "Non-LUKS decryption not attempted..."
    return 1
    fi
    exe="/sbin/cryptsetup create ${cryptname} ${cryptdev}"
    tmp=$(echo "${crypto}" | cut -d: -f1)
    [ -n "${tmp}" ] && exe="${exe} --hash \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f2)
    [ -n "${tmp}" ] && exe="${exe} --cipher \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f3)
    [ -n "${tmp}" ] && exe="${exe} --key-size \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f4)
    [ -n "${tmp}" ] && exe="${exe} --offset \"${tmp}\""
    tmp=$(echo "${crypto}" | cut -d: -f5)
    [ -n "${tmp}" ] && exe="${exe} --skip \"${tmp}\""
    if [ -f ${ckeyfile} ]; then
    exe="${exe} --key-file ${ckeyfile}"
    else
    exe="${exe} --verify-passphrase"
    echo ""
    echo "A password is required to access the ${cryptname} volume:"
    fi
    eval "${exe} ${CSQUIET}"
    if [ $? -ne 0 ]; then
    err "Non-LUKS device decryption failed. verify format: "
    err " crypto=hash:cipher:keysize:offset:skip"
    exit 1
    fi
    if [ -e "/dev/mapper/${cryptname}" ]; then
    if [ ${DEPRECATED_CRYPT} -eq 1 ]; then
    export root="/dev/mapper/root"
    fi
    else
    err "Password succeeded, but ${cryptname} creation failed, aborting..."
    exit 1
    fi
    else
    err "Failed to open encryption mapping: The device ${cryptdev} is not a LUKS volume and the crypto= paramater was not specified."
    fi
    fi
    rm -f ${ckeyfile}
    fi
    Create /mnt/lib/initcpio/install/etwo:
    #!/bin/bash
    build() {
    local mod
    add_module dm-crypt
    if [[ $CRYPTO_MODULES ]]; then
    for mod in $CRYPTO_MODULES; do
    add_module "$mod"
    done
    else
    add_all_modules '/crypto/'
    fi
    add_dir "/dev/mapper"
    add_binary "cryptsetup"
    add_binary "dmsetup"
    add_binary "/usr/bin/gpg"
    add_file "/usr/lib/udev/rules.d/10-dm.rules"
    add_file "/usr/lib/udev/rules.d/13-dm-disk.rules"
    add_file "/usr/lib/udev/rules.d/95-dm-notify.rules"
    add_file "/usr/lib/initcpio/udev/11-dm-initramfs.rules" "/usr/lib/udev/rules.d/11-dm-initramfs.rules"
    add_runscript
    help ()
    cat<<HELPEOF
    This hook allows for an encrypted root device with support for gpg encrypted key files.
    To use gpg, the key file must have the extension .gpg and you have to install gpg and add /usr/bin/gpg
    to your BINARIES var in /etc/mkinitcpio.conf.
    HELPEOF
    Edit /mnt/etc/mkinitcpio.conf (only relevant sections displayed):
    MODULES=”ext2 ext4” # not sure if this is really nessecary.
    BINARIES=”/usr/bin/gpg” # this could probably be done in install/etwo...
    HOOKS=”base udev usbinput keymap autodetect pata scsi sata usb etwo filesystems” # (usbinput is only needed if you have an usb keyboard)
    Copy the initcpio stuff over to the live cd:
    cp /mnt/lib/initcpio/hooks/etwo /lib/initcpio/hooks/
    cp /mnt/lib/initcpio/install/etwo /lib/initcpio/install/
    cp /mnt/etc/mkinitcpio.conf /etc/
    Verify your LOCALE, KEYMAP and TIMEZONE in /etc/rc.conf!
    Now reinstall the initcpio:
    mkinitcpio -g /mnt/boot/kernel26.img
    Make sure there were no errors and that all hooks were included.
    13. Decrypt the "var" key to the encrypted root
    mkdir /mnt/keys
    chmod 500 /mnt/keys
    gpg –output /mnt/keys/var -d /mnt/boot/var.gpg
    chmod 400 /mnt/keys/var
    14. Setup crypttab
    Edit /mnt/etc/crypttab:
    swap /dev/sda1 SWAP -c aes-cbc-essiv:sha256 -s 256 -h whirlpool
    var /dev/sda2 /keys/var
    15. Reboot
    We're done, you may reboot. Make sure you select the usb stick as the boot device in your bios and hope for the best. . If it didn't work, play with grub's settings or boot from the live cd, mount your encrypted devices and check all settings. You might also have less trouble by using uuid's instead of device names.  I chose device names to keep things as simple as possible, even though it's not the optimal way to do it.
    Make backups of your data and your usb stick and do not forget your password(s)! Or you can say goodbye to your data forever...
    Last edited by fabriceb (2013-01-15 22:36:23)

    I'm trying to run my install script that is based on https://bbs.archlinux.org/viewtopic.php?id=129885
    Decrypting the gpg key after grub works, but then "Devce root already exists." appears every second.
    any idea ?
    #!/bin/bash
    # This script is designed to be run in conjunction with a UEFI boot using Archboot intall media.
    # prereqs:
    # EFI "BIOS" set to boot *only* from EFI
    # successful EFI boot of Archboot USB
    # mount /dev/sdb1 /src
    set -o nounset
    #set -o errexit
    # Host specific configuration
    # this whole script needs to be customized, particularly disk partitions
    # and configuration, but this section contains global variables that
    # are used during the system configuration phase for convenience
    HOSTNAME=daniel
    USERNAME=user
    # Globals
    # We don't need to set these here but they are used repeatedly throughout
    # so it makes sense to reuse them and allow an easy, one-time change if we
    # need to alter values such as the install target mount point.
    INSTALL_TARGET="/install"
    HR="--------------------------------------------------------------------------------"
    PACMAN="pacman --noconfirm --config /tmp/pacman.conf"
    TARGET_PACMAN="pacman --noconfirm --config /tmp/pacman.conf -r ${INSTALL_TARGET}"
    CHROOT_PACMAN="pacman --noconfirm --cachedir /var/cache/pacman/pkg --config /tmp/pacman.conf -r ${INSTALL_TARGET}"
    FILE_URL="file:///packages/core-$(uname -m)/pkg"
    FTP_URL='ftp://mirrors.kernel.org/archlinux/$repo/os/$arch'
    HTTP_URL='http://mirrors.kernel.org/archlinux/$repo/os/$arch'
    # Functions
    # I've avoided using functions in this script as they aren't required and
    # I think it's more of a learning tool if you see the step-by-step
    # procedures even with minor duplciations along the way, but I feel that
    # these functions clarify the particular steps of setting values in config
    # files.
    SetValue () {
    # EXAMPLE: SetValue VARIABLENAME '\"Quoted Value\"' /file/path
    VALUENAME="$1" NEWVALUE="$2" FILEPATH="$3"
    sed -i "s+^#\?\(${VALUENAME}\)=.*$+\1=${NEWVALUE}+" "${FILEPATH}"
    CommentOutValue () {
    VALUENAME="$1" FILEPATH="$2"
    sed -i "s/^\(${VALUENAME}.*\)$/#\1/" "${FILEPATH}"
    UncommentValue () {
    VALUENAME="$1" FILEPATH="$2"
    sed -i "s/^#\(${VALUENAME}.*\)$/\1/" "${FILEPATH}"
    # Initialize
    # Warn the user about impending doom, set up the network on eth0, mount
    # the squashfs images (Archboot does this normally, we're just filling in
    # the gaps resulting from the fact that we're doing a simple scripted
    # install). We also create a temporary pacman.conf that looks for packages
    # locally first before sourcing them from the network. It would be better
    # to do either *all* local or *all* network but we can't for two reasons.
    # 1. The Archboot installation image might have an out of date kernel
    # (currently the case) which results in problems when chrooting
    # into the install mount point to modprobe efivars. So we use the
    # package snapshot on the Archboot media to ensure our kernel is
    # the same as the one we booted with.
    # 2. Ideally we'd source all local then, but some critical items,
    # notably grub2-efi variants, aren't yet on the Archboot media.
    # Warn
    timer=9
    echo -e "\n\nMAC WARNING: This script is not designed for APPLE MAC installs and will potentially misconfigure boot to your existing OS X installation. STOP NOW IF YOU ARE ON A MAC.\n\n"
    echo -n "GENERAL WARNING: This procedure will completely format /dev/sda. Please cancel with ctrl-c to cancel within $timer seconds..."
    while [[ $timer -gt 0 ]]
    do
    sleep 1
    let timer-=1
    echo -en "$timer seconds..."
    done
    echo "STARTING"
    # Get Network
    echo -n "Waiting for network address.."
    #dhclient eth0
    dhcpcd -p eth0
    echo -n "Network address acquired."
    # Mount packages squashfs images
    umount "/packages/core-$(uname -m)"
    umount "/packages/core-any"
    rm -rf "/packages/core-$(uname -m)"
    rm -rf "/packages/core-any"
    mkdir -p "/packages/core-$(uname -m)"
    mkdir -p "/packages/core-any"
    modprobe -q loop
    modprobe -q squashfs
    mount -o ro,loop -t squashfs "/src/packages/archboot_packages_$(uname -m).squashfs" "/packages/core-$(uname -m)"
    mount -o ro,loop -t squashfs "/src/packages/archboot_packages_any.squashfs" "/packages/core-any"
    # Create temporary pacman.conf file
    cat << PACMANEOF > /tmp/pacman.conf
    [options]
    Architecture = auto
    CacheDir = ${INSTALL_TARGET}/var/cache/pacman/pkg
    CacheDir = /packages/core-$(uname -m)/pkg
    CacheDir = /packages/core-any/pkg
    [core]
    Server = ${FILE_URL}
    Server = ${FTP_URL}
    Server = ${HTTP_URL}
    [extra]
    Server = ${FILE_URL}
    Server = ${FTP_URL}
    Server = ${HTTP_URL}
    #Uncomment to enable pacman -Sy yaourt
    [archlinuxfr]
    Server = http://repo.archlinux.fr/\$arch
    PACMANEOF
    # Prepare pacman
    [[ ! -d "${INSTALL_TARGET}/var/cache/pacman/pkg" ]] && mkdir -m 755 -p "${INSTALL_TARGET}/var/cache/pacman/pkg"
    [[ ! -d "${INSTALL_TARGET}/var/lib/pacman" ]] && mkdir -m 755 -p "${INSTALL_TARGET}/var/lib/pacman"
    ${PACMAN} -Sy
    ${TARGET_PACMAN} -Sy
    # Install prereqs from network (not on archboot media)
    echo -e "\nInstalling prereqs...\n$HR"
    #sed -i "s/^#S/S/" /etc/pacman.d/mirrorlist # Uncomment all Server lines
    UncommentValue S /etc/pacman.d/mirrorlist # Uncomment all Server lines
    ${PACMAN} --noconfirm -Sy gptfdisk btrfs-progs-unstable libusb-compat gnupg
    # Configure Host
    # Here we create three partitions:
    # 1. efi and /boot (one partition does double duty)
    # 2. swap
    # 3. our encrypted root
    # Note that all of these are on a GUID partition table scheme. This proves
    # to be quite clean and simple since we're not doing anything with MBR
    # boot partitions and the like.
    echo -e "format\n"
    # shred -v /dev/sda
    # disk prep
    sgdisk -Z /dev/sda # zap all on disk
    #sgdisk -Z /dev/mmcb1k0 # zap all on sdcard
    sgdisk -a 2048 -o /dev/sda # new gpt disk 2048 alignment
    #sgdisk -a 2048 -o /dev/mmcb1k0
    # create partitions
    sgdisk -n 1:0:+200M /dev/sda # partition 1 (UEFI BOOT), default start block, 200MB
    sgdisk -n 2:0:+4G /dev/sda # partition 2 (SWAP), default start block, 200MB
    sgdisk -n 3:0:0 /dev/sda # partition 3, (LUKS), default start, remaining space
    #sgdisk -n 1:0:1800M /dev/mmcb1k0 # root.gpg
    # set partition types
    sgdisk -t 1:ef00 /dev/sda
    sgdisk -t 2:8200 /dev/sda
    sgdisk -t 3:8300 /dev/sda
    #sgdisk -t 1:0700 /dev/mmcb1k0
    # label partitions
    sgdisk -c 1:"UEFI Boot" /dev/sda
    sgdisk -c 2:"Swap" /dev/sda
    sgdisk -c 3:"LUKS" /dev/sda
    #sgdisk -c 1:"Key" /dev/mmcb1k0
    echo -e "create gpg file\n"
    # create gpg file
    dd if=/dev/urandom bs=512 count=4 | gpg -v --cipher-algo aes256 --digest-algo sha512 -c -a > /root/root.gpg
    echo -e "format LUKS on root\n"
    # format LUKS on root
    gpg -q -d /root/root.gpg 2>/dev/null | cryptsetup -v --key-file=- -c aes-xts-plain -s 512 --hash sha512 luksFormat /dev/sda3
    echo -e "open LUKS on root\n"
    gpg -d /root/root.gpg 2>/dev/null | cryptsetup -v --key-file=- luksOpen /dev/sda3 root
    # NOTE: make sure to add dm_crypt and aes_i586 to MODULES in rc.conf
    # NOTE2: actually this isn't required since we're mounting an encrypted root and grub2/initramfs handles this before we even get to rc.conf
    # make filesystems
    # following swap related commands not used now that we're encrypting our swap partition
    #mkswap /dev/sda2
    #swapon /dev/sda2
    #mkfs.ext4 /dev/sda3 # this is where we'd create an unencrypted root partition, but we're using luks instead
    echo -e "\nCreating Filesystems...\n$HR"
    # make filesystems
    mkfs.ext4 /dev/mapper/root
    mkfs.vfat -F32 /dev/sda1
    #mkfs.vfat -F32 /dev/mmcb1k0p1
    echo -e "mount targets\n"
    # mount target
    #mount /dev/sda3 ${INSTALL_TARGET} # this is where we'd mount the unencrypted root partition
    mount /dev/mapper/root ${INSTALL_TARGET}
    # mount target
    mkdir ${INSTALL_TARGET}
    # mkdir ${INSTALL_TARGET}/key
    # mount -t vfat /dev/mmcb1k0p1 ${INSTALL_TARGET}/key
    mkdir ${INSTALL_TARGET}/boot
    mount -t vfat /dev/sda1 ${INSTALL_TARGET}/boot
    # Install base, necessary utilities
    mkdir -p ${INSTALL_TARGET}/var/lib/pacman
    ${TARGET_PACMAN} -Sy
    ${TARGET_PACMAN} -Su base
    # curl could be installed later but we want it ready for rankmirrors
    ${TARGET_PACMAN} -S curl
    ${TARGET_PACMAN} -S libusb-compat gnupg
    ${TARGET_PACMAN} -R grub
    rm -rf ${INSTALL_TARGET}/boot/grub
    ${TARGET_PACMAN} -S grub2-efi-x86_64
    # Configure new system
    SetValue HOSTNAME ${HOSTNAME} ${INSTALL_TARGET}/etc/rc.conf
    sed -i "s/^\(127\.0\.0\.1.*\)$/\1 ${HOSTNAME}/" ${INSTALL_TARGET}/etc/hosts
    SetValue CONSOLEFONT Lat2-Terminus16 ${INSTALL_TARGET}/etc/rc.conf
    #following replaced due to netcfg
    #SetValue interface eth0 ${INSTALL_TARGET}/etc/rc.conf
    # write fstab
    # You can use UUID's or whatever you want here, of course. This is just
    # the simplest approach and as long as your drives aren't changing values
    # randomly it should work fine.
    cat > ${INSTALL_TARGET}/etc/fstab <<FSTAB_EOF
    # /etc/fstab: static file system information
    # <file system> <dir> <type> <options> <dump> <pass>
    tmpfs /tmp tmpfs nodev,nosuid 0 0
    /dev/sda1 /boot vfat defaults 0 0
    /dev/mapper/cryptswap none swap defaults 0 0
    /dev/mapper/root / ext4 defaults,noatime 0 1
    FSTAB_EOF
    # write etwo
    mkdir -p /lib/initcpio/hooks/
    mkdir -p /lib/initcpio/install/
    cp /src/etwo_hooks /lib/initcpio/hooks/etwo
    cp /src/etwo_install /lib/initcpio/install/etwo
    mkdir -p ${INSTALL_TARGET}/lib/initcpio/hooks/
    mkdir -p ${INSTALL_TARGET}/lib/initcpio/install/
    cp /src/etwo_hooks ${INSTALL_TARGET}/lib/initcpio/hooks/etwo
    cp /src/etwo_install ${INSTALL_TARGET}/lib/initcpio/install/etwo
    # write crypttab
    # encrypted swap (random passphrase on boot)
    echo cryptswap /dev/sda2 SWAP "-c aes-xts-plain -h whirlpool -s 512" >> ${INSTALL_TARGET}/etc/crypttab
    # copy configs we want to carry over to target from install environment
    mv ${INSTALL_TARGET}/etc/resolv.conf ${INSTALL_TARGET}/etc/resolv.conf.orig
    cp /etc/resolv.conf ${INSTALL_TARGET}/etc/resolv.conf
    mkdir -p ${INSTALL_TARGET}/tmp
    cp /tmp/pacman.conf ${INSTALL_TARGET}/tmp/pacman.conf
    # mount proc, sys, dev in install root
    mount -t proc proc ${INSTALL_TARGET}/proc
    mount -t sysfs sys ${INSTALL_TARGET}/sys
    mount -o bind /dev ${INSTALL_TARGET}/dev
    echo -e "umount boot\n"
    # we have to remount /boot from inside the chroot
    umount ${INSTALL_TARGET}/boot
    # Create install_efi script (to be run *after* chroot /install)
    touch ${INSTALL_TARGET}/install_efi
    chmod a+x ${INSTALL_TARGET}/install_efi
    cat > ${INSTALL_TARGET}/install_efi <<EFI_EOF
    # functions (these could be a library, but why overcomplicate things
    SetValue () { VALUENAME="\$1" NEWVALUE="\$2" FILEPATH="\$3"; sed -i "s+^#\?\(\${VALUENAME}\)=.*\$+\1=\${NEWVALUE}+" "\${FILEPATH}"; }
    CommentOutValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^\(\${VALUENAME}.*\)\$/#\1/" "\${FILEPATH}"; }
    UncommentValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^#\(\${VALUENAME}.*\)\$/\1/" "\${FILEPATH}"; }
    echo -e "mount boot\n"
    # remount here or grub et al gets confused
    mount -t vfat /dev/sda1 /boot
    # mkinitcpio
    # NOTE: intel_agp drm and i915 for intel graphics
    SetValue MODULES '\\"dm_mod dm_crypt aes_x86_64 ext2 ext4 vfat intel_agp drm i915\\"' /etc/mkinitcpio.conf
    SetValue HOOKS '\\"base udev pata scsi sata usb usbinput keymap consolefont etwo encrypt filesystems\\"' /etc/mkinitcpio.conf
    SetValue BINARIES '\\"/usr/bin/gpg\\"' /etc/mkinitcpio.conf
    mkinitcpio -p linux
    # kernel modules for EFI install
    modprobe efivars
    modprobe dm-mod
    # locale-gen
    UncommentValue de_AT /etc/locale.gen
    locale-gen
    # install and configure grub2
    # did this above
    #${CHROOT_PACMAN} -Sy
    #${CHROOT_PACMAN} -R grub
    #rm -rf /boot/grub
    #${CHROOT_PACMAN} -S grub2-efi-x86_64
    # you can be surprisingly sloppy with the root value you give grub2 as a kernel option and
    # even omit the cryptdevice altogether, though it will wag a finger at you for using
    # a deprecated syntax, so we're using the correct form here
    # NOTE: take out i915.modeset=1 unless you are on intel graphics
    SetValue GRUB_CMDLINE_LINUX '\\"cryptdevice=/dev/sda3:root cryptkey=/dev/sda1:vfat:/root.gpg add_efi_memmap i915.i915_enable_rc6=1 i915.i915_enable_fbc=1 i915.lvds_downclock=1 pcie_aspm=force quiet\\"' /etc/default/grub
    # set output to graphical
    SetValue GRUB_TERMINAL_OUTPUT gfxterm /etc/default/grub
    SetValue GRUB_GFXMODE 960x600x32,auto /etc/default/grub
    SetValue GRUB_GFXPAYLOAD_LINUX keep /etc/default/grub # comment out this value if text only mode
    # install the actual grub2. Note that despite our --boot-directory option we will still need to move
    # the grub directory to /boot/grub during grub-mkconfig operations until grub2 gets patched (see below)
    grub_efi_x86_64-install --bootloader-id=grub --no-floppy --recheck
    # create our EFI boot entry
    # bug in the HP bios firmware (F.08)
    efibootmgr --create --gpt --disk /dev/sda --part 1 --write-signature --label "ARCH LINUX" --loader "\\\\grub\\\\grub.efi"
    # copy font for grub2
    cp /usr/share/grub/unicode.pf2 /boot/grub
    # generate config file
    grub-mkconfig -o /boot/grub/grub.cfg
    exit
    EFI_EOF
    # Install EFI using script inside chroot
    chroot ${INSTALL_TARGET} /install_efi
    rm ${INSTALL_TARGET}/install_efi
    # Post install steps
    # anything you want to do post install. run the script automatically or
    # manually
    touch ${INSTALL_TARGET}/post_install
    chmod a+x ${INSTALL_TARGET}/post_install
    cat > ${INSTALL_TARGET}/post_install <<POST_EOF
    set -o errexit
    set -o nounset
    # functions (these could be a library, but why overcomplicate things
    SetValue () { VALUENAME="\$1" NEWVALUE="\$2" FILEPATH="\$3"; sed -i "s+^#\?\(\${VALUENAME}\)=.*\$+\1=\${NEWVALUE}+" "\${FILEPATH}"; }
    CommentOutValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^\(\${VALUENAME}.*\)\$/#\1/" "\${FILEPATH}"; }
    UncommentValue () { VALUENAME="\$1" FILEPATH="\$2"; sed -i "s/^#\(\${VALUENAME}.*\)\$/\1/" "\${FILEPATH}"; }
    # root password
    echo -e "${HR}\\nNew root user password\\n${HR}"
    passwd
    # add user
    echo -e "${HR}\\nNew non-root user password (username:${USERNAME})\\n${HR}"
    groupadd sudo
    useradd -m -g users -G audio,lp,optical,storage,video,games,power,scanner,network,sudo,wheel -s /bin/bash ${USERNAME}
    passwd ${USERNAME}
    # mirror ranking
    echo -e "${HR}\\nRanking Mirrors (this will take a while)\\n${HR}"
    cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.orig
    mv /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.all
    sed -i "s/#S/S/" /etc/pacman.d/mirrorlist.all
    rankmirrors -n 5 /etc/pacman.d/mirrorlist.all > /etc/pacman.d/mirrorlist
    # temporary fix for locale.sh update conflict
    mv /etc/profile.d/locale.sh /etc/profile.d/locale.sh.preupdate || true
    # yaourt repo (add to target pacman, not tmp pacman.conf, for ongoing use)
    echo -e "\\n[archlinuxfr]\\nServer = http://repo.archlinux.fr/\\\$arch" >> /etc/pacman.conf
    echo -e "\\n[haskell]\\nServer = http://www.kiwilight.com/\\\$repo/\\\$arch" >> /etc/pacman.conf
    # additional groups and utilities
    pacman --noconfirm -Syu
    pacman --noconfirm -S base-devel
    pacman --noconfirm -S yaourt
    # sudo
    pacman --noconfirm -S sudo
    cp /etc/sudoers /tmp/sudoers.edit
    sed -i "s/#\s*\(%wheel\s*ALL=(ALL)\s*ALL.*$\)/\1/" /tmp/sudoers.edit
    sed -i "s/#\s*\(%sudo\s*ALL=(ALL)\s*ALL.*$\)/\1/" /tmp/sudoers.edit
    visudo -qcsf /tmp/sudoers.edit && cat /tmp/sudoers.edit > /etc/sudoers
    # power
    pacman --noconfirm -S acpi acpid acpitool cpufrequtils
    yaourt --noconfirm -S powertop2
    sed -i "/^DAEMONS/ s/)/ @acpid)/" /etc/rc.conf
    sed -i "/^MODULES/ s/)/ acpi-cpufreq cpufreq_ondemand cpufreq_powersave coretemp)/" /etc/rc.conf
    # following requires my acpi handler script
    echo "/etc/acpi/handler.sh boot" > /etc/rc.local
    # time
    pacman --noconfirm -S ntp
    sed -i "/^DAEMONS/ s/hwclock /!hwclock @ntpd /" /etc/rc.conf
    # wireless (wpa supplicant should already be installed)
    pacman --noconfirm -S iw wpa_supplicant rfkill
    pacman --noconfirm -S netcfg wpa_actiond ifplugd
    mv /etc/wpa_supplicant.conf /etc/wpa_supplicant.conf.orig
    echo -e "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=network\nupdate_config=1" > /etc/wpa_supplicant.conf
    # make sure to copy /etc/network.d/examples/wireless-wpa-config to /etc/network.d/home and edit
    sed -i "/^DAEMONS/ s/)/ @net-auto-wireless @net-auto-wired)/" /etc/rc.conf
    sed -i "/^DAEMONS/ s/ network / /" /etc/rc.conf
    echo -e "\nWIRELESS_INTERFACE=wlan0" >> /etc/rc.conf
    echo -e "WIRED_INTERFACE=eth0" >> /etc/rc.conf
    echo "options iwlagn led_mode=2" > /etc/modprobe.d/iwlagn.conf
    # sound
    pacman --noconfirm -S alsa-utils alsa-plugins
    sed -i "/^DAEMONS/ s/)/ @alsa)/" /etc/rc.conf
    mv /etc/asound.conf /etc/asound.conf.orig || true
    #if alsamixer isn't working, try alsamixer -Dhw and speaker-test -Dhw -c 2
    # video
    pacman --noconfirm -S base-devel mesa mesa-demos
    # x
    #pacman --noconfirm -S xorg xorg-xinit xorg-utils xorg-server-utils xdotool xorg-xlsfonts
    #yaourt --noconfirm -S xf86-input-wacom-git # NOT NEEDED? input-wacom-git
    #TODO: cut down the install size
    #pacman --noconfirm -S xorg-server xorg-xinit xorg-utils xorg-server-utils
    # TODO: wacom
    # environment/wm/etc.
    #pacman --noconfirm -S xfce4 compiz ccsm
    #pacman --noconfirm -S xcompmgr
    #yaourt --noconfirm -S physlock unclutter
    #pacman --noconfirm -S rxvt-unicode urxvt-url-select hsetroot
    #pacman --noconfirm -S gtk2 #gtk3 # for taffybar?
    #pacman --noconfirm -S ghc
    # note: try installing alex and happy from cabal instead
    #pacman --noconfirm -S haskell-platform haskell-hscolour
    #yaourt --noconfirm -S xmonad-darcs xmonad-contrib-darcs xcompmgr
    #yaourt --noconfirm -S xmobar-git
    # TODO: edit xfce to use compiz
    # TODO: xmonad, but deal with video tearing
    # TODO: xmonad-darcs fails to install from AUR. haskell dependency hell.
    # switching to cabal
    # fonts
    pacman --noconfirm -S terminus-font
    yaourt --noconfirm -S webcore-fonts
    yaourt --noconfirm -S fontforge libspiro
    yaourt --noconfirm -S freetype2-git-infinality
    # TODO: sed infinality and change to OSX or OSX2 mode
    # and create the sym link from /etc/fonts/conf.avail to conf.d
    # misc apps
    #pacman --noconfirm -S htop openssh keychain bash-completion git vim
    #pacman --noconfirm -S chromium flashplugin
    #pacman --noconfirm -S scrot mypaint bc
    #yaourt --noconfirm -S task-git stellarium googlecl
    # TODO: argyll
    POST_EOF
    # Post install in chroot
    #echo "chroot and run /post_install"
    chroot /install /post_install
    rm /install/post_install
    # copy grub.efi file to the default HP EFI boot manager path
    mkdir -p ${INSTALL_TARGET}/boot/EFI/Microsoft/BOOT/
    mkdir -p ${INSTALL_TARGET}/boot/EFI/BOOT/
    cp ${INSTALL_TARGET}/boot/grub/grub.efi ${INSTALL_TARGET}/boot/EFI/Microsoft/BOOT/bootmgfw.efi
    cp ${INSTALL_TARGET}/boot/grub/grub.efi ${INSTALL_TARGET}/boot/EFI/BOOT/BOOTX64.EFI
    cp /root/root.gpg ${INSTALL_TARGET}/boot/
    # NOTES/TODO

  • How do I fix this Xmonad configuration

    Hi,
    I am trying to add multimedia keys support for my Xmonad. Here is my current
    setup.
    import XMonad
    import XMonad.Hooks.DynamicLog
    import XMonad.Hooks.ManageDocks
    import XMonad.Util.EZConfig
    import System.IO
    import XMonad.Actions.Volume
    main = xmonad =<< statusBar myBar myPP toggleStrutKey myConfig
    -- Command to launch the bar
    myBar = "xmobar"
    -- Custom PP, it determines what is written to the bar
    myPP = xmobarPP { ppCurrent = xmobarColor "#429942" "" . wrap "<" ">" }
    -- Key bindings to toggle the gap for the bar
    toggleStrutKey XConfig {XMonad.modMask = modMask} = (modMask, xK_b)
    myConfig = defaultConfig {
        manageHook = manageDocks <+> manageHook defaultConfig,
        layoutHook = avoidStruts $ layoutHook defaultConfig,
        modMask = mod4Mask, -- Rebind Mod to windows key
        borderWidth = 3
        } `additionalKeys`
        [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock"),
          ("<XF86AudioLowerVolume>", lowerVolume 3 >> return ())
    However, I am getting this error:
    Error detected while loading xmonad configuration file: /home/yasar/.xmonad/xmonad.hs
    xmonad.hs:8:8:
        No instances for (Show (l0 GHC.Word.Word32),
                          Read (l0 GHC.Word.Word32))
          arising from a use of `xmonad'
        Possible fix:
          add instance declarations for
          (Show (l0 GHC.Word.Word32), Read (l0 GHC.Word.Word32))
        In the first argument of `(=<<)', namely `xmonad'
        In the expression:
            xmonad =<< statusBar myBar myPP toggleStrutKey myConfig
        In an equation for `main':
            main = xmonad =<< statusBar myBar myPP toggleStrutKey myConfig
    xmonad.hs:8:19:
        No instance for (LayoutClass l0 Window)
          arising from a use of `statusBar'
        Possible fix:
          add an instance declaration for (LayoutClass l0 Window)
        In the second argument of `(=<<)', namely
          `statusBar myBar myPP toggleStrutKey myConfig'
        In the expression:
            xmonad =<< statusBar myBar myPP toggleStrutKey myConfig
        In an equation for `main':
            main = xmonad =<< statusBar myBar myPP toggleStrutKey myConfig
    xmonad.hs:26:8:
        Couldn't match expected type `(ButtonMask, KeySym)'
                    with actual type `[Char]'
        In the expression: "<XF86AudioLowerVolume>"
        In the expression:
          ("<XF86AudioLowerVolume>", lowerVolume 3 >> return ())
        In the second argument of `additionalKeys', namely
          `[((mod4Mask .|. shiftMask, xK_z),
             spawn "xscreensaver-command -lock"),
            ("<XF86AudioLowerVolume>", lowerVolume 3 >> return ())]'
    Please check the file for errors.
    xmonad: xmessage: executeFile: does not exist (No such file or directory)
    I was trying to follow the example in here:
    http://www.haskell.org/haskellwiki/Xmon … _xmonad.hs
    , However, I couln't make it work. I am really new to Xmonad, and never used
    Haskell before, so any help is appreciated.
    Last edited by yasar11732 (2012-02-14 15:01:13)

    pacman -Sf catalyst-utils should bring back /etc/ati, iirc.

  • SOLVED:Dmenu not launching correctly in Xmonad

    I am running xmonad and I am having issues getting the dmenu_run to execute properly. It was working fine before but now it just launches with a white bar and nothing autocompletes. I am running Xmonad 0.9.2-2.1 and dmenu 4.4-1. Here is my entry in xmonad.hs:
    , ((modMask, xK_p ), spawn "dmenu_run | dmenu -b")
    Also, here is my entire xmonad.hs:
    import XMonad hiding (Tall)
    import XMonad.Hooks.DynamicLog
    import XMonad.Hooks.ManageDocks
    import XMonad.Hooks.ManageHelpers
    import XMonad.Layout.HintedTile
    import XMonad.Layout.LayoutHints (layoutHints)
    import XMonad.Prompt
    import XMonad.Prompt.Shell
    import XMonad.Util.Run(spawnPipe)
    import System.Exit
    import System.IO
    import Data.Monoid
    import qualified XMonad.StackSet as W
    import qualified Data.Map as M
    myBorderWidth = 1
    main = do
    xmproc <- spawnPipe "/usr/bin/xmobar /home/comhack/.xmobarcc"
    xmonad $ defaultConfig {
    terminal = "urxvt",
    modMask = mod1Mask,
    workspaces = ["Net", "Chat", "Work", "4", "5", "6", "7", "8", "9"],
    normalBorderColor = "#000000",
    focusedBorderColor = "#838B8B",
    manageHook = composeOne [isFullscreen -?> doFullFloat],
    borderWidth = myBorderWidth,
    keys = myKeys,
    focusFollowsMouse = True,
    layoutHook = myLayout,
    logHook = dynamicLogWithPP $ xmobarPP
    { ppOutput = hPutStrLn xmproc,
    ppTitle = xmobarColor "green" "" . shorten 60,
    ppHiddenNoWindows = xmobarColor "grey" ""
    myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
    [ ((modMask , xK_Return ), spawn $ XMonad.terminal conf)
    , ((modm , xK_backslash ), spawn “amixer -q set Master toggle”)
    , ((modm , xK_minus ), spawn “amixer -q set Master 3- unmute”)
    , ((modm , xK_equal ), spawn “amixer -q set Master 3+ unmute”)
    , ((modMask .|. shiftMask, xK_c ), kill)
    , ((modMask , xK_space ), sendMessage NextLayout)
    , ((modMask .|. shiftMask, xK_space ), setLayout $ XMonad.layoutHook conf)
    , ((modMask , xK_n ), refresh)
    , ((modMask, xK_p ), spawn "dmenu_run | dmenu -b")
    , ((modMask , xK_Tab ), windows W.focusDown)
    , ((modMask , xK_j ), windows W.focusDown)
    , ((modMask , xK_k ), windows W.focusUp)
    , ((modMask , xK_m ), windows W.focusMaster)
    , ((modMask .|. shiftMask, xK_Return ), windows W.swapMaster)
    , ((modMask .|. shiftMask, xK_j ), windows W.swapDown)
    , ((modMask .|. shiftMask, xK_k ), windows W.swapUp)
    , ((modMask , xK_h ), sendMessage Shrink)
    , ((modMask , xK_l ), sendMessage Expand)
    , ((modMask , xK_t ), withFocused $ windows . W.sink)
    , ((modMask , xK_comma ), sendMessage (IncMasterN 1))
    , ((modMask , xK_period ), sendMessage (IncMasterN (-1)))
    , ((modMask .|. shiftMask, xK_q ), io (exitWith ExitSuccess))
    , ((modMask , xK_q ), spawn "xmonad --recompile")
    , ((modMask , xK_F2 ), shellPrompt defaultXPConfig)
    , ((0 , 0x1008ff30 ), shellPrompt defaultXPConfig)
    , ((0 , 0x1008ff13 ), spawn "amixer -q set Master 2dB+")
    , ((0 , 0x1008ff11 ), spawn "amixer -q set Master 2dB-")
    , ((0 , 0x1008ff12 ), spawn "amixer -q set Master toggle")
    , ((0 , 0x1008ff16 ), spawn "cmus-remote --prev")
    , ((0 , 0x1008ff17 ), spawn "cmus-remote --next")
    , ((0 , 0x1008ff14 ), spawn "cmus-remote --pause")
    , ((0 , 0x1008ff5b ), spawn "urxvt -e screen -rd cmus")
    , ((modMask , xK_Print ), spawn "scrot -e 'mv $f ~/Screenshots'")
    ++
    [((m .|. modMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]]
    ++
    [((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)]]
    myLayout = avoidStruts $ tiled ||| wideTiled ||| Full
    where
    tiled = HintedTile nmaster delta ratio Center Tall
    wideTiled = HintedTile nmaster delta ratio Center Wide
    nmaster = 1
    ratio = 1/2
    delta = 3/100
    It was working fine before so I am thinking that it must of been an update or something. If I run the command in a terminal, it works just fine. So it has to be the syntax or something. This works perfectly:
    dmenu_run | dmenu -b
    Any ideas?
    Last edited by securitybreach (2011-08-08 03:07:25)

    Obscaenvs wrote:
    I don't think it's an actual bug; it's just updated syntax. For me, this solved the issue:
    In my xmonad.hs, I _had_ the line
    , ((modm, xK_p ), spawn "exe=`dmenu_path | dmenu` && eval \"exec $exe\"")
    I changed this to use dmenu_run instead and not piping to dmenu:
    , ((modm, xK_p ), spawn "exe=`dmenu_run` && eval \"exec $exe\"")
    A recompile is necessary for this to take effect. One of you did not have to recompile, but that was most likely because the downgraded dmenu understood the old syntax.
    Now it works...YMMV.
    EDIT: I see now that user "securitybreach" uses "dmenu_run" already... Try not piping the command; when I did this, I got two instances of Dmenu running: one with all the executables in path as usual, and one blank.
    There are people having issues with dmenu using other window managers besides XMonad, so that is not the same issue.  Not to mention, that my spawn of dmenu is WAY less complicated than that, and I am still getting the issue (before downgrade).

Maybe you are looking for