madf: (Default)
Прекрасне відео про нутрощі XMonad:

Продовження: http://www.youtube.com/watch?v=ivdyLaH3PhY&list=PLxj9UAX4Em-IBXkvcC3MycLlcxyoi7v8B&index=4
В основному мова йде про StackSet, структуру даних що керує вікнами і workspace'ами, і про Zipper. Показано принципи зневадження на реальному прикладі. Про Zipper зовсім трохи, поверхнево. Про нього краще почитати у Дона Стюарта (один із співавторів Real World Haskell і XMonad): https://donsbot.wordpress.com/2007/05/17/roll-your-own-window-manager-tracking-focus-with-a-zipper/
Там же є посилання на оригінальну працю Gerard’а Huet’а, який і придумав Zipper.
А у джерельних кодах XMonad можна знайти цитату самого Олега:
--    A Zipper is essentially an `updateable' and yet pure functional           
--    cursor into a data structure. Zipper is also a delimited                  
--    continuation reified as a data structure.                                 
--                                                                              
--    The Zipper lets us replace an item deep in a complex data                 
--    structure, e.g., a tree or a term, without an  mutation.  The             
--    resulting data structure will share as much of its components with        
--    the old structure as possible.                                            
--                                                                              
--      Oleg Kiselyov, 27 Apr 2005, haskell\@, "Zipper as a delimited continuation"
madf: (Default)
Є одна кльова софтинка, яку я давно використовую. Але мене задовбували у ній два дуже неприємних баги: хтозна-чого вона жерла CPU як не в себе, і її вікно іноді ховалось під інші вікна (хоча завжди повинне бути on top).

Спочатку я думав пофіксити швиденько баги (у мене були ідеї щодо high CPU consumption) і відправити патчі автору, але коли я глянув код... Коротше кажучи, простіше було її тупо переписати. Тому я форкнув її (GPL v. 3) і почав корячити. Відучити її жерти проц було нескладно, мої підозри підтвердились (колись давно я таке саме робив для Psi). І здавалось що і ховання під іншими вікнами вдалось виправити. Я „причесав“ код, трохи відрефакторив, зробив єбілд у локальному оверлеї і почав радіти життю.

Але виявилось що бага з хованням під вікнами так і залишилась. При чому я ніяк не міг визначити що саме викликає цю багу: одразу після старту все працює як треба, і тільки з часом вікно починає „ховатись“ — неначе соромиться... Я витратив купу часу намагаючись побороти цей баг, але марно. Тоді у мене закралась підозра що проблема у віконному менеджері — XMonad.
Якщо вам не страшний код на Haskell можете зазирнути під кат )

Screensaver

Nov. 1st, 2012 07:54 pm
madf: (Default)
Я думаю, ні для кого не секрет що screensaver давно втратив свою початкову функцію і зараз має цінність лише з точки зору естетики і безпеки (блокування). Як я вже писав, суровим XMoand-щикам ніщо людське не чужде, тому заінсталлив XScreenSaver і прописав його у ~/.xsession.
Раніше у мене на кнопку "Sleep" був підвішений hibernate-ram:
, ((0, xK_XF86Sleep ), spawn "sudo -- /usr/sbin/hibernate-ram")

І втрачати цю пекельно зручну штуку не хотілося б. XScreenSaver сам таке не вміє, тільки диспле(йем|ями) керувати. А значить нам на допомогу прийде мало кому сьогодні відома, але надзвичайно корисна штука - atd. Це такий старезний (ровесник cron) *nix'овий демон який може виконувати команди у заданий час. Не як cron, із періодичністю, а саме у заданий момент часу. За часів роботи у GTS я за допомогою цієї "штучки" робив нічні апдейти білінгу (не люблю, знаєте, парцювати вночі) - atd запускав мої спеціальні скрипти у які я скопіював 99% свого інтелекту. Та зараз мова не про це, а про screensaver з функцією hibernate-ram. Елементарно:
#!/bin/sh

/usr/bin/xscreensaver-command -lock > /dev/null 2> /dev/null &
echo "qdbus --system org.freedesktop.UPower /org/freedesktop/UPower org.freedesktop.UPower.Suspend" | /usr/bin/at now + 10min > /dev/null 2> /dev/null

Тепер достатньо покласти цей скриптик у правильне місце і прописати його spawn для Sleep. Маємо безпеку (lock), естетику (всяка фігня на дисплеї кілька хвилинок крутиться), тишу, енергозбереження і швидкий старт (hibernate-ram).
А якщо це підв’язати до DBus... Правда, atd і xscreensaver точно не вміють DBus. А так би обійшлись коротким кодом на Haskell і ніяких тобі скриптів!
madf: (Default)
Сьогодні після чергового незначного допилювання xmonad.hs він при компіляції показав мені смачну і велику дулю: Could not find module: `XMonad.Prompt.AppendFile'.
Solution: haskell-updater --all. Чомусь -u не допоміг.
Відкрив для себе tabbed layout. Правда, поки не придумав де його можна застосувати. Мабуть для full-screen applications тіпа firefox чи okular.
madf: (Default)
Пошарився тут по сайту Hubble і рішив собі картинку на фон поставити. А то якось чорний фон трошки набрид. А, оскільки, у XMonad фон бачиш тільки на пустому десктопі, то за одно вирішив і термінал зробити напівпрозорим. Сказано - зроблено.
URxvt.depth: 32
URxvt*background: rgba:0000/0000/0000/cccc
URxvt.fading: 70
URxvt.fadeColor: [0]black

І ще xcompmgr у spawn. Правда з ним трохи підторможує repaint у Midnight Comander, але пофігу.
Тепер сиджу у терміналі під космічну музику і з космічним фоном. Ніщо, як кажуть, людське нам не чужде.
А, да. Ще забув. Прийшлось склеїти дві картинки (1280x1024 і 1920x1200) - Xinerama, а feh не вміє роздільно ставити.
madf: (Default)
Запарив мене Firefox. Точніше його вікно завантажень. Воно, як і прописано в xmonad.hs, стає float, але з часом змінює свій розмір до розміру дисплея і за ним уже нічого не видно. Звісно, мене така ситуація не влаштовувала, але, оскільки я це вікно бачив дуже рідко, то і забував про цю незручність. Сьогодні, балакаючи по Jabber з кимось вранці згадав про неї і вирішив побороти. А саме: відбуксувати це вікно у правий нижній куток, зменшивши його до нормальних розмірів.
Перша ідея - написати свій власний doMoveResizeWindow на базі moveResizeWindow. Щось типу withDisplay (\d -> moveResizeWindow d win x y w h). Для цього спочатку подивився сигнатуру doFloat:
doFloat :: ManageHook.
Але, в процесі длубання у сорсах, знайшов таке: doRectFloat у XMonad.Hooks.ManageHelpers. Саме те що треба:
[ (className =? "Firefox" <&&>
   resource  =? "Download") --> doRectFloat (W.RationalRect (3/4) (3/4) (1/4) (1/4)) ]

Profile

madf: (Default)
madf

April 2017

S M T W T F S
      1
2345678
9101112131415
1617 1819202122
23242526272829
30      

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 03:17 pm
Powered by Dreamwidth Studios