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 мою ф-цию поставить в начало, то и панелек не увижу. Что делать, как поправить?

★★★

Отладка в haskell
Отладка
в haskell
Отладка
в haskell

Ты не понял сути Haskell, он не предназначен для этого, он работает по-другому.

anonymous
()

Не, ну если бы факториал считал, иои числа Фибоначчи, то тебе бы помогли отладить.

anonymous
()
Ответ на: комментарий от anonymous

А если есть проблема неизвестной природы, как её ловить?

LIKAN ★★★
() автор топика

А может ну его нафиг, этот хаскель, если на нем бажные программы выходят?

Pavval ★★★★★
()

Итог, все успешно компилится, только вот при запуске наступает фриз.

Такого не может быть, ведь каждому борщевику известно, что если на Хаскелле компилируется, значит работает. Значит фриз - фича. Наслаждайся

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

Вот интересно, зачем ставить haskell в интересы после таких советов? Или это в качестве троллинга?

LIKAN ★★★
() автор топика

Попробуй strace'ом погонять - на каком сисколе виснет?

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

1) Раньше было более интересно

2) Иногда бывают темы, в которых пишут какой-то алгоритм, а не окошечки настраивают в задроском WM

vertexua ★★★★★
()
Последнее исправление: vertexua (всего исправлений: 1)

Загрузи куда-нибудь весь конфиг

Sectoid ★★★★★
()

С dzen не сталкивался, потому может чего-то не знаю. Но не могу понять, что управление окнами xmonad делает в logHook?

Sectoid ★★★★★
()

xmonad calls the logHook with every internal state update

А ты из него windows запускаешь, которая определённо меняет состояние

monk ★★★★★
()

Лол, сейчас эти содомиты начнут отбрёхиваться, дескать, «дедлок был в нативном коде, хацкель ни при чём!!111!»

Кстати, готов поверить. Ведь без нативных библиотек хацкель — беспомощный кусок говна.

anonymous
()
Ответ на: комментарий от anonymous

Кстати, готов поверить. Ведь без нативных библиотек хацкель — беспомощный кусок говна.

Записать байт в память (или файл) и управление на него передать - не очень сложная операция.

Можно в рантайме: http://www.grabmueller.de/martin/www/pub/harpy-demo-haskell07.pdf (одна страница)

sf ★★★
()
Ответ на: комментарий от Sectoid

Так, а возможно товарищ сверху прав. Смена фокуса инициируемая в logHook - это тоже смена состояния, и происходит ещё 1 вызов logHook, отсюда зацикливание. Там в конце было что-то про handleEventHook. Есть ли возможность его к этому делу привлечь ?

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

«Beware of bugs in the above code; I have only proved it correct, not tried it.» :)

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

А вы часом не использовали MagicFocus? Он часом не делает то, что мне как раз нужно?

Ни разу не использовал. У меня вообще основной юзкейс: 1 приложение - фулскрин на одном десктопе.

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

Теперь вопрос, делать то с этим что?

Проверять фокус на вершине стека. Если уже там, то ничего не делать (не вызывать windows).

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

Окей, вопрос, нужна пустая ф-ция , которая возвращает X(), на замену моей:

windows (\x -> x)
Как такую запилить?

LIKAN ★★★
() автор топика
import Debug.Trace

Я пользуюсь этим. И да, с отладкой в хаскеле туговато.

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

Поясните пожалуйста по подробнее. В случае с return понятно. Та функция, которую я привел в шапке будет выглядеть вот так

focusWindowHook::X()
focusWindowHook = do
                    myset <- gets windowset
                    let newcur = (W.peek myset)
                    if newcur == Nothing
                        then return ()
                        else windows W.shiftMaster
Тут вроде все просто и понятно. А вот как в случае с when
focusWindowHook::X()
focusWindowHook = do
                    myset <- gets windowset
                    let newcur = (W.peek myset)
                    when (newcur \= Nothing) windows W.shiftMaster
Так что ль?

LIKAN ★★★
() автор топика
Ответ на: комментарий от 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 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.