LINUX.ORG.RU

Отладка в haskell

 ,


0

3

Настраиваю xmonad. В данном вм тайловые окна упакованы в стек. Цель: очень хочется (если интересно почему - то Управление фокусом окна в режиме тайлинга) чтобы окно, на которое переходит фокус, автоматически отправлялось на вершину стека, т е становилось master окном. Для этого есть вот такая ф-ция

shiftMaster :: StackSet i l a s sd -> StackSet i l a s sd
И ф-ция
windows :: (WindowSet -> WindowSet) -> X ()
Вместе они выполнят ровно то, что нужно. Так же хочется не совершать никаких телодвижений, если стек пуст. Для всех этих целей была написана вот такая ф-ция
focusWindowHook::X()
focusWindowHook = do
                    myset <- gets windowset
                    let newcur = (W.peek myset)
                    if newcur == Nothing
                        then windows (\x -> x)
                        else windows W.shiftMaster
И добавлена в logHook к тому, что уже было в украденном мною конфиге
logHook            =                   --status bar config
            myTopLeftLogHook topLeftBar   <+>      --top left dzen
            myTopRightLogHook topRightBar <+>      --top right dzen
            myBotLeftLogHook botLeftBar   <+>      --bottom left dzen
            myBotRightLogHook botRightBar <+>      --bottom right dzen
            ewmhDesktopsLogHook           >>
            focusWindowHook               >>
            setWMName "LG3D"

Итог, все успешно компилится, только вот при запуске наступает фриз. Вижу все dzen панельки, но сделать ничего не могу. Если в logHook мою ф-цию поставить в начало, то и панелек не увижу. Что делать, как поправить?

★★★
Ответ на: комментарий от monk

Долго курил вот эту вот страничку (http://xmonad.org/xmonad-docs/xmonad/XMonad-StackSet.html#v:focus), но не придумал, как получить вершину стека. Те в моем случае нужно сравнить результат W.peek myset с мастер окном. Я пробовал сделать так

focusWindowHook::X()
focusWindowHook = do
                    myset <- gets windowset
                    if ( (W.peek myset) == (head (W.index myset)))
                        then return ()
                        else windows W.shiftMaster

Получил вот это
xmonad.hs:1065:79:
    Couldn't match type ‘GHC.Word.Word64’ with ‘Maybe Window’
    Expected type: W.StackSet
                     WorkspaceId (Layout Window) (Maybe Window) ScreenId ScreenDetail
      Actual type: WindowSet
    In the first argument of ‘W.index’, namely ‘myset’
    In the first argument of ‘head’, namely ‘(W.index myset)’

LIKAN ★★★
() автор топика
Ответ на: комментарий от monk

Если написать вот так

focusWindowHook = do
                    myset <- gets windowset
                    let newcur = (W.peek myset)
                    let mwindow = (head (W.index myset))
                    if ( newcur == mwindow)
                    --if ( (W.peek myset) == (head (W.index myset)))
                        then return ()
                        else windows W.shiftMaster
То ошибка будет выглядеть так
xmonad.hs:1066:56:
    Couldn't match type ‘GHC.Word.Word64’ with ‘Maybe Window’
    Expected type: Maybe Window
      Actual type: Window
    In the second argument of ‘(==)’, namely ‘mwindow’
    In the expression: (newcur == mwindow)


Другими словами, как безопасно превратить Window в Maybe Window ?
LIKAN ★★★
() автор топика
Ответ на: комментарий от monk

Ураааа!!!!! Заработало !!!! <Голосом Матроскина> Спасибо большое.

LIKAN ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.