octo_the_cat: (С нагинатой)
[personal profile] octo_the_cat
А запостю-ка я один полезный кусок конфига XMonad, пока с ним ничего не случилось.
Нагуглился он не очень просто, так что пусть висит для потомков, может кому и пригодится.
И на память.

Hint: Код делает следующую полезную (в зависимости от предпочтений юзера) вещь -
переключает раскладку клавиатуры в зависимости от текущего активного окна.
На пальцах - если вы пишете код латиницей, а потом переключаетесь в IM сказать пару слов своему
кириллическому другу, вам не придется лишний раз жмакать комбинацию для смены раскладки.
В качестве backend используется Xkb.


data XkbToggle = XkbToggle (Maybe XID) deriving ( Typeable )
instance Message XkbToggle
data XkbLayout l a = XkbLayout XID (M.Map Window XID) (l a) deriving ( Read, Show )

xkbLayout = XkbLayout 0 M.empty

instance (Ord a, LayoutClass l a) => LayoutClass (XkbLayout l) a where
    runLayout (W.Workspace tag m@(XkbLayout defXkbGroup xkbWinMap l) ms) r =
        do withWindowSet $ \ws ->
               if tag == W.currentTag ws
               then whenJust (W.peek ws) (lockGroup m)
               else return ()
           (ws, l') <- runLayout (W.Workspace tag l ms) r
           case l' of
             Nothing -> return (ws, Nothing)
             Just l -> return (ws, Just (XkbLayout defXkbGroup xkbWinMap l))

    handleMessage xkb@(XkbLayout defXkbGroup xkbWinMap l) m
        | Just (XkbToggle group) <- fromMessage m = withWindowSet (return . W.peek) >>= maybe (return Nothing) (toggleGroup xkb group)
        | otherwise = (handleMessage l m) >>= maybe (return Nothing) (\l -> return $ Just (XkbLayout defXkbGroup xkbWinMap l))

    description (XkbLayout _ _ l) = description l

xkbGetGroup :: (Ord b) => XkbLayout a b -> Window -> XID
xkbGetGroup (XkbLayout d m _) w  = M.findWithDefault d w m

foreign import ccall unsafe "XkbLockGroup" xkbLockGroup :: Display -> XID -> XID ->IO ()

lockGroup :: (Ord b) => XkbLayout a b -> Window -> X ()
lockGroup l@(XkbLayout d m _) w = withDisplay $ \dpy -> io $ xkbLockGroup dpy 0x100 (xkbGetGroup l w)

toggleGroup :: (Ord b) => XkbLayout a b -> Maybe XID -> Window -> X (Maybe (XkbLayout a b))
toggleGroup l@(XkbLayout d m l') (Just g) w = return $ Just (XkbLayout d (M.insert w g m) l')
toggleGroup l@(XkbLayout d m l') Nothing w =
    do XConf { display = dpy, theRoot = root } <- ask
       classHint <- io $ getClassHint dpy w
       if resClass classHint == "Emacs"
        then do io $ allocaXEvent $ \ev ->
                   do setEventType ev keyPress
                      keyCode <- keysymToKeycode dpy xK_backslash
                      setKeyEvent ev w root 0 controlMask keyCode True
                      sendEvent dpy w False 0 ev
                return Nothing
        else return $ Just (XkbLayout d (M.insert w (flop $ xkbGetGroup l w) m) l')
               where flop 0 = 1
                     flop _ = 0



ЗЫ Вопросы по коду, если мне не изменяет память, задаются в xmonad@conference.jabber.ru, там по идее обитает автор.
Ника, к сожалению, не помню.
ЗЗЫ Прощу прощения, кому порвал ленту, но форматирование тут важно.

Date: 2009-11-14 06:53 pm (UTC)
From: [identity profile] gelioaddicted.livejournal.com
Гы! А у Винды для каждого окна своя раскладка )

Date: 2009-11-14 07:06 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
У нормальных распространенных DE-шек, типа кед и гнома, за тебя тоже все уже сделали авторы. В моем случае отдельно стоящего оконного менеджера приходится работать самому. Причин тому - на небольшой свиток, при случае могу просветить =)

Date: 2009-11-14 07:43 pm (UTC)
From: [identity profile] k-a-t-i-a.livejournal.com
Ой, а меня знаниями из свитка просветишь? =)

"...а потом переключаетесь в IM сказать пару слов своему
кириллическому другу..." ;) *хитро подмигивает*

Date: 2009-11-14 07:58 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
если захочешь ;) *хитро подмигивает*

Date: 2009-11-14 09:03 pm (UTC)
From: [identity profile] k-a-t-i-a.livejournal.com
Да! ;) *любопытные ушки навостряются*

Date: 2009-11-14 09:08 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
Хорошо, обязательно ;))

Date: 2009-11-14 07:49 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
Xxkb смотрел, но на тот момент не догнал, как его прикрутить. Или что-то не заработало с полпинка, и расхотелось. И почти сразу нашел данное решение. Пока что it works for me, а там посмотрим.

Date: 2009-11-14 07:57 pm (UTC)
From: [identity profile] http://users.livejournal.com/_slw/
в ~/.xsession
/usr/local/bin/xxkb &

в ~/.xxkbrc
XXkb.button.enable: no
XXkb.mainwindow.enable: no

все

Date: 2009-11-14 08:06 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
Это все понятно, но почему-то не подхватывался ~/.xxkbrc.
Может в тот день у меня радиус кривизны резко увеличился.

а этих самых .xxkbrc я перепробовал штук 5, без успеха...

xxkb fail

Date: 2010-01-07 08:25 am (UTC)
From: [identity profile] jdevelop.livejournal.com
оно работать и не будет, товарищи на #xmonad рассказали

Re: xxkb fail

Date: 2010-01-07 04:18 pm (UTC)
From: [identity profile] --ronin--.livejournal.com
Ага, при дальнейшем гуглении был сделан именно такой вывод

Profile

octo_the_cat: (Default)
octo_the_cat

February 2014

S M T W T F S
      1
2345678
9101112131415
16171819202122
232425262728 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 24th, 2017 01:01 am
Powered by Dreamwidth Studios