the other side

5 Июль 2009 г.

hp mini, wifi

Возвращаясь к делам нетбучным. Прошлый раз, когда я говорил о том что с настройкой wifi на hpmini особых проблем не возникло, я таки видимо погорячился. Рецепт предложенный в Debian Wiki действительно оказался рабочим, но wifi в Debian работал как-то не очень стабильно - через какое-то время(всегда разное) сеть отваливалась, и после этого спасала только перезагрузка. Выгрузить/загрузить заново модуль wl не получалось. С другой стороны, Network Manager в Lenny, толи весьма старый, толи я чего-то не доглядел - но как выбирать нужную сеть через nm-applet я так и не понял. Пакет network-manager-gnome ставлю, но апплета типа того который я видел в Fedora или Ubuntu с выбором соединений, добавить на панель не получалось. Поскольку, наличие WiFi на нетбуке(как бы это не парадоксально звучало) для меня не особо критично - при необходимости не сложно воткнуть провод, а для того чтобы книжки читать вообще сеть нафиг не надо, то я как-то особо настройками этого всего дела не заморачивался.

Прошло некоторое время, входе экспериментов я успел поставить на нетбук Windows 7, и случайно снести предустановленную Vista в купе с разделом для восстановления(что с этим делать и насколько это страшно пока не знаю - в принципе мне Vista там не нужна), попробовать Ubuntu Remix(работает откровенно плохо: правда для этой модели убунтовчане ничего другого и не обещали, но это тема для отдельного разговора), снести к чертям стоявший там Debian, установить NetBSD(это тоже для отдельного большого разговора), и наконец заново установить Debian рядом с NetBSD(с этого Debian'а я сейчас и пишу). Поскольку у меня опять появился на нетбуке Линукс, таки решил вернуться к настройке wifi.

Напомню что речь идет о:


02:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)
Subsystem: Hewlett-Packard Company BCM4312 802.11b/g Wireless LAN Controller
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR-
Capabilities: [e8] Message Signalled Interrupts: Mask- 64bit+ Queue=0/0 Enable-
Address: 0000000000000000 Data: 0000
Capabilities: [d0] Express (v1) Endpoint, MSI 00
DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <4us,>


Раньше для установки модуля приходилось скачивать некий тарболл с сайта Broadcom, теперь этого делать не надо. Подключаем testing или unstable, как-то так:

enisey:~# grep -E '(testing|unstable)' /etc/apt/sources.list
deb http://ftp.ua.debian.org/debian/ testing main non-free contrib
deb-src http://ftp.ua.debian.org/debian/ testing main non-free contrib
deb http://ftp.ua.debian.org/debian/ unstable main non-free contrib
deb-src http://ftp.ua.debian.org/debian/ unstable main non-free contrib

Для того чтобы все же оставаться на lenny прописываем:

enisey:~# cat /etc/apt/apt.conf
APT::Default-Release "stable";
enisey:~#

далее aptitude update. Поскольку изначально Debian на Hp Mini, ставился с помощью образа флэшки для установки на eeepc, c i486-ядром, то между делом я обновил ядро из unstable до linux-image-2.6.30-1-686. После чего был установлен module-assistant, и сделано m-a prepare. Далее, поскольку в module assistant broadcom-sta я не заметил руками было установлено два пакета:

i broadcom-sta-common - Common files for the Broadcom STA Wireless driver
i broadcom-sta-source - Source for the Broadcom STA Wireless driver

После чего драйвер можно было собрать и установить с помощью m-a.

modrpobe wl, и /sbin/iwconfig показало что появился таки беспроводный интерфейс.

Текущая установка Debian у меня выполнена в духе минимализма - опять же кроме браузера, читалок, и пиджина из GUI мне ничего не надо, поэтому DE нет, соответственно даже если network manager вменяемо работает в Gnome - для меня сейчас это бесполезно. Тащить Gnome ради апплета, который непонятно как присобачивать к xmonad'у не сильно хочется. Более альтернативных способов управления network manager'ом не нагуглил, хотя не особо старался. Вспомнил что в былые времена пользовался wifi-radar - и в принципе он меня во всем устраивал, поставил его и на этот раз(вариант настраивать wifi через interfaces отметается). Программа простая, неприхотливая, и делает все что мне надо(в зависимостях, правда, python-gtk, но это не сильно страшно):

На этом этапе долго тупил, оказывается кнопка включения/выключения wifi таки работает и он был выключен, а я не заметил сразу :)

Если все работает, по советам надо сделать echo "wl" >> /etc/modules. Сделал и я, ушел в перезагрузку, и после перезагрузки увидел странное: модуль загружен, но... разрешение стало очень маленьким(наверное 640х480), убрал модуль из modules - перезагрузка - разрешение нормальное.

Решение "в лоб", которое почти работает: грузить модуль, и соответственно wifi-radar после загрузки Х-ов. Для этого, в /etc/rc2.d:

ls S99* | while read i; do echo mv $i ${i//S99/S98}; done | sh
mv S20wifi-radar S99wifi-radar

и в /etc/init.d/wifi-radar в start было дописано вот так:

("start")
vpnc-disconnect >/dev/null 2>&1
rmmod b43
modprobe lib80211_crypt_tkip
modprobe wl
log_begin_msg "Starting wifi-radar daemon..."
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec "${WR_BIN}" -- -d >/dev/null 2>&1 &
exit $?
;;

Скорее всего с точки зрения дебиановской идеологии коряво - но работает. Единственное что - когда перезапустишь xdm - разрешение портится, не очень страшно, но неприятно, надо будет все же поискать источник глюка. Во время написания этого поста wifi не вырубался(писал прямо в blogger), что радует.


UPDATE:
Дописал "PanelSize" "1024x600" в /etc/X11/xorg.conf:

Section "Device"
Identifier "Configured Video Device"
Driver "openchrome"
Option "PanelSize" "1024x600"
EndSection

Проблема с стартом Х-ов после загрузки модуля wifi пропала. Полтергейст какой-то.

14 Июнь 2009 г.

Блоггинг. Твиттер. Разговоры :)

Видимо я должен извиниться перед читателями этого блога. Не только не выдержал взятый темп: четыре поста в месяц, что примерно один пост в неделю, но и просто совсем замолчал надолго. На то были свои объективные и субъективные причины, в основном, просто много работы, после которой не остается никакого желания что-то где-то писать.

Как раз где-то в марте-апреле, в твиттере набрел на несколько статей о том как правильно вести блог. Обычно я подобную макулатуру игнорирую, но тут как-то стало интересно, и какое-то количество советов о том чего же таки правильно делать осилил. Советов было много, автор видимо матерый бумагомаратель, но сводились они все к одному и достаточно простому: если хотите быть популярным блоггером и зарабатывать на этом деньги, писать надо много, писать надо постоянно, писать надо предсказуемо для читателя, и иметь план на несколько недель вперед. Во всем этом меня смущает несколько вещей: во-первых, так или иначе тебя подталкивают к тому чтобы нести всякую чушь по теме, только бы был пост, и только бы в этот день читатели не остались голодными(хотя тут еще вопрос "читатели или поисковые боты?"). То есть необходимость писать даже если рассказывать вобщем-то на данный момент нечего, или особого желания нет. То есть блоггинг - как средство высказывать свои мысли, тем, кому эти мысли могут показаться интересными, превращаясь в инструмент зарабатывания денег, собственно, уже может и не предполагать мыслей стоящих за буквами. Страшно то, что, день ото дня это все популярней и популярней.

Более того, из-за того что за всем этим в конечном счете стоят деньги: желание заработать напрямую, на рекламе, или же заработать себе авторитет - у подобного "постить-чтобы-было" подхода есть острая необходимость в самоутверждении. То есть "если ты делаешь по другому - тебя не будут, не должны читать. Эй, люди! Не читайте его!". Ну и для усиления эффекта можно немного поэксплуатировать понятия "популярный блогер", "уважаемый блогер" итп, какая разница что там везде должна быть приставка "в очень узком кругу".

Второй момент, на который я обратил внимание, в статьях про блоггинг - словосочетание "профессиональный блоггер". Читал статьи достаточно давно, но ощущение того что с этим миром явно что-то не так не проходит. Профессиональный блоггер, как я понимаю это - это человек для которого блоггинг является источником дохода, то есть человек пишущий статьи за деньги. Людей которые пишут статьи за деньги - называют журналистами. И, таки да, они должны уметь писать по теме, вне зависимости от своих желаний, и выражать свои личные мысли по теме для журналиста вполне не обязательно, а в некоторых областях даже вредно.

Другая связанная с блоггингом тема - микроблоггинг вообще и твиттер в частности. Как я уже писал, после некоторых размышлений, я таки зарегистрировался в этом популярном сервисе. Ощущения у меня оно до сих пор вызывает какие-то неоднозначные. На данный момент за своим твиттером я не слежу, ничего туда не пишу, и особо не тянет.

Там где я поднимал темы про твиттер, основные возражения в основном крутились вокруг того что это очередная никому ненужная ЖЖешечка, в которой будет "наступил на кота, с женой поругался", только благодаря легкости написания сообщений, в еще более извращенной форме. Как ни странно, вот как раз этого в русском твиттере я нашел не так уж много, и читать подобную клинику никто не заставляет, в основном ее таки не читают.

С другой стороны, достаточное количество рекламы имеет место быть. Постепенно до рунетовских бизнесменов(возможно до тех самых "профессиональных блоггеров") начинает доходить что твиттер - неплохой инструмент для раскрутки своих ресурсов. Иногда, впрочем, ресурсы достаточно интересные, и можно было бы и последить за новостями(хотя, я все-таки для этого предпочитаю RSS), часто - абсолютный бред, но этот абсолютный бред фолловит тебя с завидной частотой в надежде что ты сделаешь то же самое.

Подобную методику применяют и люди, видимо начитавшись всякого сеошного бреда про то как достичь популярности в твиттере. Зачем оно им, и что делать с популярностью среди случайно зафоловленной сотней-другой аналогичных бото-человек - они представляют достаточно слабо. В итоге даже при моем абсолютном молчании, меня периодически продолжают фолловить какие-то странные личности. В данный момент мне не жалко - всех фолловлю в ответ - просто никого не читаю. Если вдруг вернусь к чтению - проведу коренную ревизию.

Я не знаю что было изначальной задумкой для использования твиттера - сейчас чаще всего о микроблогинге говорят как об оффлайновом чате. Люди постят свои сообщения тогда когда им удобно, ты постишь/отвечаешь - тогда, когда удобно тебе, и всем как бы хорошо. На самом деле все несколько по-другому, многие сообщения рассчитаны на мгновенный ответ, и реплай даже через несколько часов, как и в полноценных чатах теряет всякий смысл. Методика чтения "в конце дня читаю все что накопилось за день", если хочется принимать активное участие в жизни твиттера подходит слабо(в отличии от форумов, или блогов через RSS, или даже жуйки), в единичных случаях. С другой стороны, постоянное подсознательное выискивание "про это можно было бы написать в твиттер", рискующее превратиться в своеобразную зависимость - тоже как-то не очень. Это примерно тоже самое что подбор тем для блога, только в 100 раз быстрее - то есть слишком быстро, если в этой каше не вариться, а вариться в обычной жизни.

Ну и фактической причиной того что я пока не пишу и не читаю в твиттер является то что пока что не нашел нормального клиента для Linux, который бы мне нравился. Хочется что-то типа Mac'овского Twitterific'а - красивое и простое, а оно все какое-то топорное и недоделанное.

Вот так, как-то странно получается и с блоггингом и с твиттером одно и тоже - сначала идея начинает набирать популярность, среди тех кому это просто интересно или по каким-то причинам нужно, а потом приходят ушлые дядьки и начинают думать как бы на этих людях заработать (:

16 Март 2009 г.

XFCE+Xmonad

Just a small tip. Starting xmonad in XFCE(~/.xinitrc):

wm=xfce4-session
#wm=/usr/bin/e16
#export WINDOW_MANAGER="/usr/bin/xmonad"

#/usr/bin/gnome-settings-daemon &
$wm &
wmpid=$!
{
/usr/bin/X11/xkbcomp -I$HOME/.xkb/ $HOME/.xkb/.xkb.my $DISPLAY
while ps aux | grep xfwm; do
sleep 2
done
pkill xfwm
xmonad &
# /usr/bin/syndaemon -i 10 -d &


}&
wait $wmpid



2 Март 2009 г.

HP Mini. Нетбук с человеческим лицом.

В одном из Линуксфорумовских обсуждений по поводу того какой ноутбук выбрать, кто-то, определённо опытный в делах железных заметил: "купи любой, поработай с ним какое-то время, а потом станет ясно что тебе от ноутбука надо, и как его выбирать". Примерно та же история произошла и у меня, только с ноутбуками поменьше, которые в народе именуют нетбуками.

Последние несколько постов этого блога, так или иначе были связаны с настройкой Линукс на недавно купленном EeePC. Как игрушка - штука безусловно интересная, но для чего бы практического это чудо приспособить - я пока так и не нашёл. Как "маленький лэптопчик, чтобы поиграться с Линуксом" он все же не годится, поскольку "поиграться" все же включает в себя много-много тыцаний по кнопкам - будь это терминал, браузер или текстовый редактор, а когда эти кнопки не очень большие, и шанс промазать примерно равен шансу попасть куда надо - то даже написание простого поста в блог может превратиться в пытку, даже если забыть о том что экранчик маленький, и к этому надо привыкнуть. Возможно превращу EeePC свой в такой себе маленький сервер, не знаю, пока что он лежит и пылится без дела. Лежит и пылится без дела, в том числе и потому что появилась новая игрушка.

Где-то недели полторы назад, во время похода за обедом, мну показали заодно в тамошнем супермаркете электроники HP Mini. По сравнению с рядом стоящими Asus EeePC, и Acer Aspire One в глаза сразу бросились:

- нормальный размер кнопок на клавиатуре;

- интересный тачпад - с кнопками не внизу, а по бокам, причём кнопками достаточно легко нажимающимися(в отличии от EeePC);

- дизайн, на фоне EeePC и Acer'а HP Mini выгляди достаточно колоритно, и почему-то многим напоминает MacBook Pro(корпус тоже алюминиевый :) ). Хотя, надо отдать должное и Asus'у c Acer'ом - мигающих лампочек, разноцветного пластика и прочих идиотских штук, которые любят цеплять на бюджетные ноуты, на нетбуки они пока не цепляли. Еще бы эти странные наклейки поубирали - вообще была бы красота :)

Вобщем, HP Mini понравился мне гораздо больше, чем лежавший дома Asus, поэтому, в скорости, я подарил его себе на день рожденья(о чем и отрапортовал в твиттере).

Итак, мну достался HP Mini 2133, c процессором "VIA C7-M Processor 1200MHz", 1Gb памяти, и жёстким диском на 120 Гб:

01:00.0 VGA compatible controller: VIA Technologies, Inc. CN896/VN896/P4M900 [Chrome 9 HC] (rev 01)

02:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)

07:03.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5788 Gigabit Ethernet (rev 03)

80:01.0 Audio device: VIA Technologies, Inc. VT1708/A [Azalia HDAC] (VIA High Definition Audio Controller) (rev 10)

В процессе - выдрал из EeePC прежде в него вставленную 2Гб планку памяти, и переставил ее в HP Mini. В HP Mini добраться до памяти несколько сложнее - нужно открутить три болтика под аккумулятором, осторожно выдрать клавиатуру, и уже под клавиатурой найти заветный слот памяти. Правда, при этом вроде как никаких наклеек не сдирается, процесс установки памяти расписан на сайте HP, так что вроде как даже с гарантией должно быть все хорошо.





Предустановленная ОС: MS Vista Home Basic. Это было мое первое "свидание" с вистой, надо сказать, что я ожидал худшего. Первое ощущение: я бы смог работать в этой ОС, правда на более мощном компьютере. Второе ощущение: в винде наконец-то приличное сглаживание - не знаю правда - это заслуга винды или особенности монитора, хочется верить что таки винды. Поразило, кстати, колличество служб запущенных по-умолчанию - даже по сравнению с Хр - многовато будет, повыключал то что показалось ненужным, правда, слегка переусердствовал и вырубил звук, впрочем, по этому поводу не особо страдаю, и назад включать пока что не стал. Тормозит оно не то чтобы очень, полазить по интернету сойдет, правда интересно поставить туда Visual Studio Express, посмотреть насколько это страшно будет выглядеть. Хотя, конечно, работать в Vista я не собирался.

Предустановленная виста, означает что где-то должен быть образ для восстановления системы. В HP не стали давать DVD, для восстановления системы на нетбуке на котором собственно DVD-привода нет, а создали бэкап раздел. Впрочем на 4Гб флэшке EeePC бэкап-раздел смотрелся бы смешно :). Бэкап раздел в конце диска, создан как primary parition, занимает около 9 Гб, доступ к восстановлению через хоткей при загрузке BIOSа. Через такие же хоткеи там можно еще загрузится по сети, или с флэшки, что удобно.

Ни висту, ни бэкап-раздел сносить я не собирался - вдруг прийдется нести ноут по гарантии, а там нема "родной ОС", да и винду под рукой иметь не помешает, иногда полезно. Поэтому раздел с вистой был урезан до 50 Гб(средствами самой висты это можно сделать, если что), а на освободившемся месте создано два раздела: ~10 ~40 Gb для корня, и /home соответственно. Флэшка, на которую я ставил Debian для EeePC сохранилась, и тот Debian нормально загрузился на HP Mini, поэтому я просто скопировал то что уже было на флэшке, и установил загрузщик.

Специально никогда не интересовался вопросом, но по откликам складывалось оущение что виста не очень дружит с грубом, или груб с вистой, и чтобы в дуалбуте был Linux и Vista придётся попотеть. Как ни странно, совсем ничего трудного там нет, и стандартного:

title "Microsoft Windows Vista"

root (hd0,0)

chainloader +1

в /boot/grub/menu.lst оказалось достаточно.

Значительно больше проблем было с тем чтобы заставить нормально работать Х-ы. Видео на HP Mini тоже на VIA-чипсете:

01:00.0 VGA compatible controller: VIA Technologies, Inc. CN896/VN896/P4M900 [Chrome 9 HC] (rev 01)

Х-овый драйвер для этого дела, в поставке debian lenny: xserver-xorg-video-openchrome никак не хотел ставить разрешение больше чем 640x480 - всякие странные пляски с modeline'ами делу не помогали. На работе собрали пакет для этого драйвера из svn, и, о чудо, все заработало.

Звук: работал из коробки, сетевуха - работала из коробки, wifi - мне помог рецепт на debian wiki, камера - у себя не пробовал, но видел работающей в дебиане на аналогичном девайсе. Вобщем кроме разрешения ни с чем особо мучится не пришлось.

В общем, если говорить об ощущениях - пока нравится, и можно не только как игрушку использовать, но и как просто маленький лэптопчик для того чтобы в сети полазить, в терминале что-то по быстрому сделать итп. Для экспериментов с Линуксом вполне подходит. :)

15 Февраль 2009 г.

EeePC, Debian,Xmonad с яблочным вкусом, заметки ламера :)

Итак, господа, кажется свершилось и "lenny" таки зарелизили. Не то чтобы на меня этот факт сильно уж повлиял: на рабочем десктопе у меня вялообновляемый unstable, на домашнем сервере "etch", который пока нет никакого желания и большой необходимости обновлять, "lenny" фактически только на EeePC, вот там его таки надо будет обновить до актуального состояния: 49 пакетов требующих обновления набежало. Но все-равно как-то приятно, что любимый дистрибъютив живет, и развивается в своем традиционном ключе.

Выходные выдались на удивление тихими, хотя оживленная рабочая неделя обещала совсем другое, и я продолжил играться с EeePC, в ключе "стянуть привычные вещи с Мака", на этот раз существенной корректировке подвергся конфиг Xmonad'а.

1. Фактически, активно пользоваться множеством рабочих столов я начал только в OS X - в Leopard'е они называются Spaces, и почему-то эти Spaces мне понравились и я нашел им достойное применение. По-умолчанию рабочих стола четыре, на каждом из которых я стараюсь запускать лишь определенные приложения: на первом - IM-клиент, на втором - терминал(ы), на третьем - почтовый клиент, на четвертом - различные браузеры. Такой расклад сложился исторически, и я к нему привык. Остальные приложения запускаются где прийдется, особой стратегии нет.

Что в этом плане прежде всего хотелось от Xmonad'а? - привязать запуск конкретного приложения к конкретному рабочему столу, для каждого рабочего стола установить свои специфические Layout'ы, которые подходят для запускаемых на нем приложений. Оказывается, сделать это достаточно просто. Допустим у нас четыре рабочих стола:

myWorkspaces = ["1","2","3","4"]

Для того чтобы firefox(iceweasel в дебиане) запускался на четвертом, в ManageHooks надо добавить что-то типа:

className =? "Iceweasel" --> doF(W.shift "4")

className можно подсмотреть в выводе утилиты xprop:

diesel@xenocefal:~$ xprop | grep WM_CLASS
WM_CLASS(STRING) = "xterm", "XTerm"

после запуска этой строчки курсор изменит форму и нужно будет щелкнуть им по окну WM_CLASS которого мы хотим узнать.

Вторая задача: каждому воркспейсу по своему Layout'у решается с помощью расширения XMonad.Layout.PerWorkspace, соответствующий import нужно добавить в начало конфига, а затем в layoutHook настройки будут выглядеть следующим образом:

myLayout = avoidStruts $
onWorkspace "1" (( windowNavigation $ (mytabs ****|* mytabs)) ||| mytabs) $
onWorkspaces ["2","3"] mytabs $
onWorkspace "4" (noBorders Full ||| mytabs)$
noBorders Full

я думаю комментировать тут особо нечего.

2. Apple'овцы для своих Spaces, кроме казалось бы логичной схемы переключения между рабочими столами а-ля Alt+F1, or smth like, когда нужно четко указать рабочий стол на который хочешь переключится, сделали еще одну, которой я активно пользуюсь. Основана эта схема переключения на, скажем так, задании относительного пути :) Допустим наша схема расположения рабочих столов выглядит вот так:




12
34

тогда, допустим если я нахожусь на рабочем столе за нумером два, и жму Ctrl + Down - я попадаю на рабочий стол за нумером четыре, Ctrl+Right - приведет на рабочий стол за нумером 3, а Ctrl+Up никуда не приведет, ну и так далее. При четырех рабочих столах, в принципе такими сочетаниями клавиш можно попасть с любого рабочего стола на любой. И хотя, вроде бы, такой способ переключения перечит заветам интерфейсостроителей в плане "хорошо, когда какое-нибудь действие приводит всегда к одному и тому же результату", что в нашем случае можно интерпретировать как "приводит на вполне определенный за каждым конкретным хоткеем рабочий стол", но тем не менее, как я уже сказал, подобную схему нахожу удобной.

Очевидный способ, частного решения данной задачи для четырех рабочих столов достаточно прост - зададим функцию которая, скажем по названию рабочего стола, и коду нажатой клавиши будет возвращать нам название рабочего стола на который требуется перейти. Получится что-то типа:

switchSpace "1" 2 = "1"
switchSpace "1" 4 = "4"
switchSpace "1" 6 = "2"
switchSpace "1" 8 = "3"
switchSpace "2" 2 = "2"
switchSpace "2" 4 = "1"
switchSpace "2" 6 = "3"
switchSpace "2" 8 = "4"
switchSpace "3" 2 = "1"
switchSpace "3" 4 = "2"
switchSpace "3" 6 = "4"
switchSpace "3" 8 = "3"
switchSpace "4" 2 = "2"
switchSpace "4" 4 = "3"
switchSpace "4" 6 = "1"
switchSpace "4" 8 = "4"

не очень красиво, но жить можно, если не понадобится больше рабочих столов. 2,4,6,8 - здесь, это отфонарные коэфициенты для стрелочек, на основе того как они на NumPad'е есть.

Когда такая функция в конфиге появится, в хоткеи можно дописать строчки типа:

((modMask, xK_Right), withWindowSet $ \s -> do windows $ W.view (switchSpace ( W.tag . W.workspace . W.current $ s ) 6))

и если мы ничего не напутали с цифрами - все будет работать. Попробуем немного упростить эту строчку, и сделать так чтобы нам было меньше писать:

((modMask, xK_Right), switchFrom 6)

где switchFrom объявим отдельно как:

switchFrom x = withWindowSet $ \s -> do windows $ W.view (switchSpace (currentTag s) x)
currentTag s = W.tag . W.workspace . W.current $ s

currentTag здесь возвращает название текущего воркспейса, которое нам нужно дать switchSpace для определения воркспейса на который мы хотим переключится, а собственно в функции switchFrom происходит переключение.

Допустим, что рабочих столов будет больше, очевидно нужно немного изменить поведение функции switchSpace для того чтобы она более разумно выдавала следующий рабочий стол. Итак:

switchSpace w x = myWorkspaces!!((myNextIndex w x)-1)

в переводе на человеческий: вытащить из списка myWorkspaces элемент за нумером, который получится в результате выполнения функции myNextIndex, ну вернее (myNextIndex-1). w - имя текущего воркспейса, x - "номер ассоциированный со стрелочкой".

myNextIndex w x = myNextWorkspace ( (myElemIndex w myWorkspaces)+1 ) x

здесь myElemIndex находит под каким индексом в списке myWorkspaces спрятано имя текущего десктоп, прибавляет к нему единицу(мне не хочется считать десктопы с нуля), и отдает на съедение myNextWorkspace:

myNextWorkspace current turn | current + turn > 0 && current + turn <= rows * cols = current + turn
| current + turn == 0 && turn == -1 = rows*cols
| current + turn == rows+cols + 1 && turn == 1 = 1
| otherwise = current

myNextWorkspace самая главная функция. Логика работы следующая, мы немного меняем циферки которые передаются при нажатии каждой клавиши:

Up = (-колличество строк)
Down = колличество строк
Left = -1
Up = +1

и.... пробуем: если сумма номера текущего рабочего стола влазит в количество рабочих столов - возвращаем эту сумму, если не влазит - возвращаем другие странные значения. Все вместе это выглядит примерно так. Хоткеи:

[ ((modMask, xK_Right), switchFrom 1)
,((modMask, xK_Left), switchFrom (-1))
,((modMask, xK_Up), switchFrom (-rows))
,((modMask, xK_Down), switchFrom rows) ]



Прочая ерунда:

switchFrom x = withWindowSet $ \s -> do windows $ W.view (switchSpace (currentTag s) x)
currentTag s = W.tag . W.workspace . W.current $ s
rows = 2
cols = 2
myNextWorkspace :: Int->Int->Int
myNextWorkspace current turn | current + turn > 0 && current + turn <= rows * cols = current + turn
| current + turn == 0 && turn == -1 = rows*cols
| current + turn == rows+cols + 1 && turn ==1=1
| otherwise = current myElemIndex :: Eq a => a -> [a] -> Int
myElemIndex x a = head (elemIndices x a)
myNextIndex w x = myNextWorkspace ( (myElemIndex w myWorkspaces)+1 ) x
switchSpace w x = myWorkspaces!!((myNextIndex w x)-1)


Я не силен в haskell'е - много раз начинал разбираться, но кажется надо очень много свободного времени для таких разборок... и этот десяток строк занял у мну достаточно много времени на разбирательства, хотя не скажу что было скучно и неинтересно. Уверен, что можно это записать как-то более разумно, но я рад получить хоть и ugly, но работающий вариант. :)