0

I have been a long time user of XMonad until I switched to an ergonomic keyboard layout, namely the Bépo (http://bepo.fr/wiki/Accueil).

Until thenI was using the XMonad.Config.Azerty module for my keyboard. But since the layout change the keyboard shorcuts were broken.
More exactly the workpaces switching ones (home+1=workspace1, home+2=workspace2, etc...).
I then switched back to the default config but it was not better.

I obviously does not need the defaultAzerty function anymore.
Does someone know what should I be doing to remap the home +1..9 combinaison so that they work.

EDIT : updated config

Here is my config :

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Arrows #-}

import XMonad
import Graphics.X11.ExtraTypes.XF86
import qualified Data.Map as M
import qualified XMonad.StackSet as W
import XMonad.Hooks.DynamicLog
--
import XMonad.Layout.NoBorders
--
import Data.Ratio
import XMonad.Layout.PerWorkspace
import XMonad.Layout.Spacing
import XMonad.Layout.Grid
import XMonad.Layout.IM

main :: IO ()
main = xmonad =<< xmobar myConf

-- |Main configuration, override the defaults to your liking.
myConf = defaultConfig
   { modMask = mod4Mask
   , terminal = "urxvt"
   , layoutHook = smartBorders $ myLayout
   , workspaces = myWorkspaces
   , keys = myKeys }

-- | Keyboard keys
homeMask :: KeyMask
homeMask =  133 -- from the xev data

keysToAdd x =
    [ ((mod4Mask, xK_F4 ), kill)
    , ((0, xF86XK_Calculator ), spawn "mate-calculator")
    , ((0, xF86XK_WWW ), spawn "firefox")
    , ((0, xF86XK_HomePage ), spawn "caja")
    , ((0, xK_Print ), spawn "mate-screenshot")
    , ((mod4Mask, xK_z ), spawn "emacs") ]
    ++
    [((m .|. homeMask, k), windows $ f i) 
       | (i, k) <- zip (XMonad.workspaces defaultConfig) [10 .. 19]
       , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)] ]

keysToDel x = [((mod4Mask .|. shiftMask), xK_c)] -- to delete the unused keys

myKeys x = foldr M.delete (keysToAdd' x) (keysToDel x)
  where
    -- to include new keys to existing keys
    keysToAdd' x = M.union (keys defaultConfig x) (M.fromList (keysToAdd x))

-- |Workspaces listing
myWorkspaces = ["1:main", "2:edit", "3:web", "4:browse", "5:irc", "6:pidgin"]

-- |Default layout
myLayout = pidgin $ Mirror tiled ||| tiled ||| Full
    where
        -- pidgin conf
        pidgin = onWorkspace "6:pidgin" pidginLayout
        pidginLayout = withIM (18/100) (Role "buddy_list") gridLayout
        gridLayout = spacing 8 $ Grid

        -- default tiling algorithm partitions the screen into two panes
        tiled = spacing 2 $ Tall nmaster delta ratio
        -- The default number of windows in the master pane
        nmaster = 1
        -- Default proportion of screen occupied by master pane
        ratio = 2/3
        -- Percent of screen to increment by when resizing panes
        delta = 5/100

Also I saw that post but I don't know if it is what I want : Switching workspaces in xmonad using programmer dvorak keyboard layout (shifted numbers)

I have no problem with the haskell language but the XMonad API is that big.

EDIT2 : following what is written here http://blacketernal.wordpress.com/set-up-key-mappings-with-xmodmap/, my home key is already a modifier

Here is the dump of the last lines :

xmodmap: up to 4 keys per modifier, (keycodes in parentheses):

shift Shift_L (0x32), Shift_R (0x3e) lock Caps_Lock (0x42) control Control_L (0x25), Control_R (0x69) mod1
Alt_L (0x40), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)

Chris Stryczynski
  • 30,145
  • 48
  • 175
  • 286

1 Answers1

1

The basic approach I use is to launch xev, type the key combination that you want to do something, and notice what keysyms show up. If I understand correctly, you want to type Home+1 to take you to workspace 1. When I tried that, I get the following, but your results are probably different.

KeyRelease event, serial 33, synthetic NO, window 0x2600001,
    root 0x1dc, subw 0x0, time 255407786, (1090,771), root:(1093,774),
    state 0x0, keycode 10 (keysym 0x31, 1), same_screen YES,
    XLookupString gives 1 bytes: (31) "1"
    XFilterEvent returns: False

KeyRelease event, serial 33, synthetic NO, window 0x2600001,
    root 0x1dc, subw 0x0, time 255407938, (1090,771), root:(1093,774),
    state 0x0, keycode 110 (keysym 0xff50, Home), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Next you add the appropriate hook to your xmonad. Looking at that post you referenced, maybe something like this would work?

homeMask              :: KeyMask
homeMask              =  110 -- from the xev data

[((m .|. homeMask, k), windows $ f i)
    | (i, k) <- zip (XMonad.workspaces conf) [xK_1 .. xK_9]
    , (f, m) <- [(W.greedyView, 0), (W.shift, shiftMask)]

EDIT: Before you go too far debugging this, perhaps a simpler test is in order to make sure we have the Home key trapped properly. Add the following to your config:

homeMask              :: KeyMask
homeMask              =  110 -- from the xev data

And put this in the keysToAdd in your config:

, ((homeMask, xK_z                    ), spawn "emacs")

Now restart XMonad and see if Home+z launches emacs.

mhwombat
  • 8,026
  • 28
  • 53
  • I understand that the W comes from the import qualified XMonad.StackSet as W line (which is not on the mentionned post) but where does the conf variable come from? – Komodo Telkin Oct 16 '13 at 12:51
  • I think in your case it you would substitute `myConf` for `conf`. – mhwombat Oct 16 '13 at 13:32
  • Never mind figured it out, right now it compiles but does not work. The conf bit comes from tats configuration (https://bbs.archlinux.org/viewtopic.php?id=78602). Will give feedback when it works, could help anyone who uses bepo and xmonad together – Komodo Telkin Oct 16 '13 at 13:32
  • See my edit. Let's find out if this simple change works, and then we'll tackle the larger issue. – mhwombat Oct 16 '13 at 13:37
  • yes it works but without the [((m .|. ... bit that does not even compile, using xev, I found that my homeMask. = 133 and the 1 to 0 keys are [10..19] :: [KeyMask] – Komodo Telkin Oct 16 '13 at 14:00
  • Ok it compiles (have updated the config). But still can't switch workspaces – Komodo Telkin Oct 16 '13 at 14:23
  • Oops, I meant that line to say `homeMask`, not `mod4Mask`. Corrected now. Let's see how that goes. – mhwombat Oct 16 '13 at 14:26
  • yes indeed the problem may come frm that. it does work with mod4Mask (which is expected) but not with homeMask – Komodo Telkin Oct 16 '13 at 14:34
  • I was afraid of that. I don't know what you would have to do to use Home as a modifier key. Maybe you could do it by changing your Xmodmap, or maybe something more drastic is required. Anyway, there are two issues here: (1) Get the Home key to act as a modifier, and (2) Set up the XMonad configuration to take advantage of that. The first issue is simpler to work on outside of XMonad, and has to be solved before we can make progress on the second one. – mhwombat Oct 16 '13 at 14:39
  • Possibly helpful: https://www.linuxquestions.org/questions/linux-hardware-18/add-a-new-modifier-key-589698/ – mhwombat Oct 16 '13 at 14:44
  • I'm afraid we've reached the limits of my knowledge. XMonad questions sometimes languish on StackOverflow; you might try the XMonad mailing list http://xmonad.org/community.html – mhwombat Oct 16 '13 at 15:16