Xmonad (Вопросы и обсуждение)

ion, dwm, wmii, awesome, xmonad и другие

Модератор: Модераторы разделов

Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Всё-таки девелоперы kde4 — редкостные дятлы, вот что xprop выдаёт на диалогах dolphin:

Код: Выделить всё

_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL

При этом

Код: Выделить всё

WM_WINDOW_ROLE
, естественно, нет, а _NET_WM_NAME выдаётся, похоже, случайным образом: «Копирование», «Копирование 2 файлов» и «Копирование (5 Mib из 747 Mib)» может выдаваться для одной и той же операции. Мне ещё больше хочется, чтобы wayland издох ещё до релиза.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Xmonad

Сообщение Portnov »

А при чём тут wayland?
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Portnov писал(а):
03.06.2012 20:30
А при чём тут wayland?

Да при том,что там подобное на постоянной основе планируется. Баг запостил — судя по реакции девелоперов это и правда баг, а не «политика партии».
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Предположим, я по хоткею запускаю приложение (spawn), могу я ему средствами xmonad поменять имя, тип, роль? Ну хоть что-то, чтоб его можно было потом отличить от других окон того же класса, у которых всё осталось умолчальным?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Xmonad

Сообщение Portnov »

Можно, что-то такое:

Код: Выделить всё

import Graphics.X11

setAtom :: Window -> String -> String -> X ()
setAtom w name value = withDisplay (io . setAtom')
    where setAtom' d = do
                                       a <- internAtom d name False
                                       rw <- rootWindow d $ defaultScreen d
                                       setTextProperty d w value a

setAtom w "WM_WINDOW_CLASS" "myclass"


Главная сложность в том, чтобы выяснить окно, с которым это надо проделать (w). Тут надо смотреть исходники X.A.SpawnOn, там вроде как-то это сделано.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Забыл отписать про решение для Dolphin, с ролью в соседней теме подсказали:

Код: Выделить всё

manageHook=myManageHook <+> manageDocks <+> placeHook myPlacement <+> manageMenus <+> manageDialogs <+> myManageHook2 <+> myManageHook3
myManageHook3 = composeAll
  [ className =? "Dolphin" <&&> role /=? "Dolphin#1"              --> doFloat
  ]
  where
    role = stringProperty "WM_WINDOW_ROLE"


Вроде работает.
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Xmonad

Сообщение Yaros »

Подскажите, xmonad ругается на where в данной функции:

Код: Выделить всё

    myLayout = smartBorders $
            onWorkspace "work" (magicFocus (OneBig obWidth obHeight) ||| Full ||| magicFocus (ThreeColMid nmaster delta ratio)) $
            onWorkspace "write" (Full ||| Mirror (TwoPane delta (1/2)) ||| magicFocus (OneBig obWidth obHeight)) $
            onWorkspace "read" (magicFocus (OneBig obWidth obHeight) ||| Full ||| magicFocus (ThreeColMid nmaster delta ratio)) $
            onWorkspace "internet" (Full ||| Mirror (TwoPane delta (1/2))) $
            onWorkspace "communication" ( Full ||| magicFocus (OneBig obWidth obHeight) $
            onWorkspace "media" (Full ||| magicFocus (ThreeColMid nmaster delta ratio)) $
            onWorkspace "system" (Grid ||| magicFocus (OneBig obWidth obHeight)) $
            Full
            where
             nmaster = 1
             ratio   = 2/3
             delta   = 3/100
             obHeight = 3/4
             obWidth = 3/4

Куда копать и как исправить?
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Xmonad

Сообщение Portnov »

У строки с where отступ сделайте меньше, чем у предыдущих.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Xmonad

Сообщение Yaros »

Portnov писал(а):
13.08.2012 21:04
У строки с where отступ сделайте меньше, чем у предыдущих.

Не помогло, как писал

Код: Выделить всё

parse error on input `where'

так и пишет =(
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Xmonad

Сообщение Yaros »

Мистика %)
Ошибок при запуске не возникает, однако не работают лэйауты. Все работает как Full.
Конфиг: xmonad.hs

Код: Выделить всё

$xmonad --version
xmonad 0.10

Система Debian Wheezy testing.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Кстати говоря, сильно xmonad.hs при переходе с 0.9 на 0.10 перелопачивать надо?
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Xmonad

Сообщение Portnov »

Последнее существенное изменение, которое я помню — удалили параметр numlockMask (оно теперь само вычисляется). Больше вроде ничего давно не менялось...
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Portnov писал(а):
16.11.2012 11:24
Последнее существенное изменение, которое я помню — удалили параметр numlockMask (оно теперь само вычисляется). Больше вроде ничего давно не менялось...

Так и оказалось, всего две правки внёс в xmonad.hs : numlockMask убрал и Layout.Minimize подправил — там самую малость синтаксис поменялся.
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Чуть выше есть мой совет по поводу диалоговых окон dolphin, а вот совет для распаковки файлов из контекстного меню этого самого dolphin:

Код: Выделить всё

 [ className =? "Ark" <&&> textname /=? "Ark"              --> doFloat
  ]
  where
    textname = stringProperty "WM_NAME"
Спасибо сказали:
Аватара пользователя
Gaiuz
Сообщения: 2
ОС: Windows 7

Re: Xmonad

Сообщение Gaiuz »

Подскажите как реализовать разворачивания окна на весь экран?
Пробую сделать это используя XMonad.Layout.Fullscreen - но ничего не выходит, где я мог ошибиться?

Код: Выделить всё

....
import XMonad.Layout.Fullscreen

mylayout = avoidStruts $ smartBorders (tall ||| Mirror tall ||| Full ||| fullscreen)
        where
            tall = Tall 1 (3/100) (1/2)
            fullscreen = (fullscreenFull Full)
....
Спасибо сказали:
Аватара пользователя
Gaiuz
Сообщения: 2
ОС: Windows 7

Re: Xmonad

Сообщение Gaiuz »

Gaiuz писал(а):
20.02.2013 23:27
Подскажите как реализовать разворачивания окна на весь экран?
Пробую сделать это используя XMonad.Layout.Fullscreen - но ничего не выходит, где я мог ошибиться?

Прошу прощения, ответ нашел сам, ошибка найдена, оказалось что fullscreenFull не работает в пределах avoidStruts, исправил на

Код: Выделить всё

mylayout = avoidStruts (tall ||| Mirror tall ||| Full) ||| noBorders (fullscreenFull Full)
        where
            tall = Tall 1 (3/100) (1/2)

И все заработало.
Спасибо сказали:
vsdfn
Сообщения: 147
ОС: Windows,Linux,BSD

Re: Xmonad

Сообщение vsdfn »

Делаю в .xinitrc и xmonad не отвечает на хоткеи
xscreensaver -nosplash & exec xmobar /home/user/.xmonad/.xmobarrc & exec ck-launch-session dbus-launch --sh-syntax --exit-with-session xmonad > ~/.xmonad/pipe

как только комментирую
#> ~/.xmonad/pipe

то всё работает

второй вопрос: как встроить trayer в xmobar ? Он у меня запускается строкой
trayer --edge bottom --align right --SetDockType true --SetPartialStrut true --expand true --widthtype percent --width 5 --transparent true --tint 0x000000 --height 12 &


но при этом он появляется отдельно от xmobar
Спасибо сказали:
pol01
Сообщения: 94

Re: Xmonad

Сообщение pol01 »

Приветствую всех. Пытаюсь пересесть за xmonad, и возник такой вопрос. У меня монитор 27", поэтому обычно все программы я запускаю не в полноэкранном режиме, а "вполовину" монитора (размер главной области в компоновке Tall). Сейчас вынужден запускать, например, браузер и терминал, иначе работать просто неудобно. Может быть кто-нибудь подскажет компоновку, или настройки, чтобы даже одна запущенная программа, занимала половину экрана?
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Может кто делал ранее что-то похожее:

1. Есть монитор с 9-ю workspaces.
2. Есть второй монитор, на котором хотелось бы получить десятый workspace.
3. У этого workspace свои layouts, впрочем, если там будет только noBorders full — хватит и этого.
4. На второй монитор можно отправить фрейм хоткеем, ну и с него тоже.
5. На фреймы втрого монитора не влияют смены layouts на первом мониторе, всевозможные alt-tab и gaps.

Т.е. по сути достаточно, если второй монитор сможет отображать фрейм в фуллскрин и реагировать на хоткеи только если на нём курсор или (как вариант) мы явно на него переключились хоткеем.

Пробовал сообразить что-то подобное при помощи independent screens — не получилось.

UP: В пределах одного X-сервера, а том ноговато проблем с устройствами ввода два одновременно видимых X-сервера создают.
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Xmonad

Сообщение Yaros »

Попытка обновить xmonad-contrib на Генте завершается провалом. Вот лог:

Код: Выделить всё

 * Package:    x11-wm/xmonad-contrib-0.11.2
 * Repository: gentoo-haskell
 * Maintainer: haskell@gentoo.org
 * USE:        abi_x86_64 amd64 elibc_glibc kernel_linux userland_GNU xft
 * FEATURES:   preserve-libs sandbox userpriv usersandbox
 * Applying xmonad-contrib-0.11.2-ghc-7.8.patch ...
 [ ok ]
 * Using cabal-1.18.1.2.
 * Prepending /usr/lib64/ghc-7.6.3 to LD_LIBRARY_PATH
/usr/bin/ghc -package Cabal-1.18.1.2 --make /var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/work/xmonad-contrib-0.11.2/Setup.lhs -dynamic -o setup
[1 of 1] Compiling Main             ( /var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/work/xmonad-contrib-0.11.2/Setup.lhs, /var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/work/xmonad-contrib-0.11.2/Setup.o )
Linking setup ...
./setup configure --ghc --prefix=/usr --with-compiler=/usr/bin/ghc --with-hc-pkg=/usr/bin/ghc-pkg --prefix=/usr --libdir=/usr/lib64 --libsubdir=xmonad-contrib-0.11.2/ghc-7.6.3 --datadir=/usr/share/ --datasubdir=xmonad-contrib-0.11.2/ghc-7.6.3 --ghc-option=-optl-Wl,-O1 --ghc-option=-optl-Wl,--as-needed --disable-executable-stripping --docdir=/usr/share/doc/xmonad-contrib-0.11.2 --verbose --sysconfdir=/etc --flags=-testing --flags=use_xft
Configuring xmonad-contrib-0.11.2...
Flags chosen: testing=False, use_xft=True, small_base=True
Dependency X11 >=1.6.1 && <1.7: using X11-1.6.1.1
Dependency X11-xft >=0.2: using X11-xft-0.3.1
Dependency base >=3 && <5: using base-4.6.0.1
Dependency containers -any: using containers-0.5.0.0
Dependency directory -any: using directory-1.2.0.1
Dependency extensible-exceptions -any: using extensible-exceptions-0.1.1.4
Dependency mtl >=1 && <3: using mtl-2.1.2
Dependency old-locale -any: using old-locale-1.0.0.5
Dependency old-time -any: using old-time-1.1.0.1
Dependency process -any: using process-1.1.0.2
Dependency random -any: using random-1.0.1.1
Dependency unix -any: using unix-2.6.0.1
Dependency utf8-string -any: using utf8-string-0.3.8
Dependency xmonad ==0.11.*: using xmonad-0.11
setup: The following installed packages are broken because other packages they
depend on are missing. These broken packages must be rebuilt before they can
be used.
package X11-xft-0.3.1 is broken due to missing package
utf8-string-0.3.7-1d0990243cdcebf03df4fdedfb179fd3
 * ghc-pkg check: 'checking for other broken packages:'
There are problems in package xmonad-contrib-0.11.2:
  Warning: haddock-interfaces: /usr/share/doc/xmonad-contrib-0.11.2/html/xmonad-contrib.haddock doesn't exist or isn't a file
  Warning: haddock-html: /usr/share/doc/xmonad-contrib-0.11.2/html doesn't exist or isn't a directory
  dependency "utf8-string-0.3.7-1d0990243cdcebf03df4fdedfb179fd3" doesn't exist
  dependency "xmonad-0.11-a1ddddae82b975c6544dfeed22a03086" doesn't exist
There are problems in package X11-xft-0.3.1:
  Warning: haddock-interfaces: /usr/share/doc/x11-xft-0.3.1/html/X11-xft.haddock doesn't exist or isn't a file
  Warning: haddock-html: /usr/share/doc/x11-xft-0.3.1/html doesn't exist or isn't a directory
  dependency "utf8-string-0.3.7-1d0990243cdcebf03df4fdedfb179fd3" doesn't exist

The following packages are broken, either because they have a problem
listed above, or because they depend on a broken package.
xmonad-contrib-0.11.2
X11-xft-0.3.1
 * Detected broken packages: X11-xft-0.3.1 xmonad-contrib-0.11.2
 * ERROR: x11-wm/xmonad-contrib-0.11.2::gentoo-haskell failed (configure phase):
 *   //==-- Please, run 'haskell-updater' to fix broken packages --==//
 *
 * Call stack:
 *     ebuild.sh, line   93:  Called src_configure
 *   environment, line 2896:  Called haskell-cabal_src_configure '--flags=-testing' '--flags=use_xft'
 *   environment, line 2022:  Called cabal-configure '--flags=-testing' '--flags=use_xft'
 *   environment, line  642:  Called cabal-show-brokens-and-die 'setup configure failed'
 *   environment, line  736:  Called cabal-show-brokens
 *   environment, line  732:  Called cabal-die-if-nonempty 'broken' 'X11-xft-0.3.1' 'xmonad-contrib-0.11.2'
 *   environment, line  664:  Called die
 * The specific snippet of code:
 *       die "//==-- Please, run 'haskell-updater' to fix ${breakage_type} packages --==//"
 *
 * If you need support, post the output of `emerge --info '=x11-wm/xmonad-contrib-0.11.2::gentoo-haskell'`,
 * the complete build log and the output of `emerge -pqv '=x11-wm/xmonad-contrib-0.11.2::gentoo-haskell'`.
 * The complete build log is located at '/var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/temp/environment'.
 * Working directory: '/var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/work/xmonad-contrib-0.11.2'
 * S: '/var/tmp/portage/x11-wm/xmonad-contrib-0.11.2/work/xmonad-contrib-0.11.2'
Запускать haskell-updater пробовал, он нашел 15 пакетов, включая xmonad-contrib, 14 смог обновить, на контрибе крашится.
Пересобрал xmonad и X11-xft, не помогло.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

По предыдущему вопросу нашёл что-то близкое к тому, что надо:

Код: Выделить всё

, ((modm .|. shiftMask), layoutScreens 1 (fixedLayout [Rectangle 1280 0 1920 1080]))

Вопрос: как бы вот это вот переключение раскладки выполнять не по хоткею, а автоматически, при загрузке xmonad?
Или может можно как-то извне скомандовать xmonad выполнить эту строчку? Что-нибудь менее топорное, нежели эмуляция нажатия клавиш.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Xmonad

Сообщение sgfault »

AlexYeCu писал(а):
27.02.2015 00:17
Вопрос: как бы вот это вот переключение раскладки выполнять не по хоткею, а автоматически, при загрузке xmonad?

Так?

Код: Выделить всё

, startupHook = layoutScreens 2 (fixedLayout [Rectangle 0 0 640 480, Rectangle 641 481 1040 570])

Вообще, сделать это из Layout-а (те layoutHook-а) не получится, тк runLayout-у передается только Workspace, а надо модифицировать StackSet. Те это означает, что это можно сделать из (теоретически) любой функции в X монаде. Вот пример для manageHook-а:

Код: Выделить всё

, manageHook = liftX $ layoutScreens 2 (fixedLayout [Rectangle 0 0 640 480, Rectangle 641 481 1040 570]) >> return (Endo id)

(хотя из logHook-а так просто не получится..)
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

О, спасибо, вариант через manageHook работает как надо, похоже.

А, нет. Решение неидеально — если второй монитор отключён, то все фреймы смещаются при создании нового. Но куда копать вроде понятно.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Xmonad

Сообщение sgfault »

Ну да, смещаются.. Вообще, я не совсем понял первоначальную задачу: вы хотите использовать XMonad.Layout.PerWorkspace (для 10-го workspace), а также сделать невозможным переключение на 10-й workspace, когда вы находитесь на (допустим) 1-ом Screen-е (те, возможно, XMonad.Layout.IndependentScreens) ? Если так, то не совсем понятно зачем вам вообще XMonad.Layout.LayoutScreens .
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Xmonad

Сообщение sgfault »

(обновление 2)

Что же касается исправления работы layoutScreens, то один из вариантов - это использовать handleEventHook и вызывать layoutScreens только, когда подключен внешний монитор. Например, так (работает со старой версией (1.5) libghc-x11; в новых, наверно, можно проверять RRScreenChangeNotifyEvent , dynStatusBarEventHook):

Код: Выделить всё

onScreenChange :: Event -> X All
onScreenChange (ConfigureEvent {ev_window = w}) = do
    whenX (isRoot w) $ do
      n <- countScreens
      if (n > 1)
        then do
          layoutScreens 2 (fixedLayout [Rectangle 0 0 640 480, Rectangle 641 481 1040 570])
        else rescreen
    return (All True)
onScreenChange   _  = return (All True)

-- From: XMonad.Layout.IndependentScreens .
countScreens :: (MonadIO m, Integral i) => m i
countScreens = liftM genericLength . liftIO $ openDisplay "" >>= liftA2 (<*) getScreenInfo closeDisplay


но это работать не будет, тк то, что делает layoutScreens отменяется rescreen-ом. Дело в том, что пользовательский handleEventHook вызывается перед встроенным xmonad-овским, а встроенный обработчик для ConfigureEvent тоже вызывает rescreen (на самом деле, код выше - это почти копипаст из XMonad/Main.hsc). Вот строчки из XMonad/Main.hsc, где это делается :

Код: Выделить всё

xmonad initxmc = do
...
  forever $ prehandle =<< io (nextEvent dpy e >> getEvent e)
    where
...
      prehandle e = let ... in local (\c -> ...) (handleWithHook e)
...
handleWithHook :: Event -> X ()
handleWithHook e = do
  evHook <- asks (handleEventHook . config)
  whenX (userCodeDef True $ getAll `fmap` evHook e) (handle e)
...
handle :: Event -> X ()
-- configuration changes in the root may mean display settings have changed
handle (ConfigureEvent {ev_window = w}) = whenX (isRoot w) rescreen


Хотя все равно остаются варианты: тот же countScreens можно вызывать и в manageHook-е, и, если мониторов два, вызывать layoutScreens:

Код: Выделить всё

...
   , manageHook = liftX $ onTwoScreens
...

onTwoScreens :: X (Endo WindowSet)
onTwoScreens    = do
    n <- countScreens
    if (n > 1)
      then do
        layoutScreens 2 (fixedLayout [Rectangle 0 0 640 480, Rectangle 641 481 1040 570])
      else rescreen
    return (Endo id)


ЗЫ. Но как layoutScreens решает первоначальную задачу мне все равно непонятно..

Обновление 1
Хм.. у меня пересчет дисплеев при каждом открытии окна добавляет заметную задержку. Это можно попробовать исправить, сохранив количество дисплеев в Extensible State. Те в handleEventHook-е будет просто обновляться количество физических мониторов, а в manageHook-е - просто будем смотреть это значение:

Код: Выделить всё

{-# LANGUAGE DeriveDataTypeable #-}

import qualified XMonad.Util.ExtensibleState as XS

...
          , manageHook = liftX $ onTwoScreens
          , handleEventHook = onScreenChange
...


onTwoScreens :: X (Endo WindowSet)
onTwoScreens    = do
    NScreens n <- XS.get
    if (n > 1)
      then do
        layoutSplitScreen 2 (fixedLayout [Rectangle 0 0 640 480, Rectangle 641 481 1040 570])
      else rescreen
    return (Endo id)

newtype NScreens    = NScreens Int
  deriving (Show, Read, Typeable)
instance ExtensionClass NScreens where
    initialValue    = NScreens 1
    extensionType   = PersistentExtension

onScreenChange :: Event -> X All
onScreenChange (ConfigureEvent {ev_window = w}) = do
    whenX (isRoot w) $ countScreens >>= XS.put . NScreens
    return (All True)
onScreenChange   _  = return (All True)

-- From: XMonad.Layout.IndependentScreens .
countScreens :: (MonadIO m, Integral i) => m i
countScreens = liftM genericLength . liftIO $ openDisplay "" >>= liftA2 (<*) getScreenInfo closeDisplay


Обновление 2
Наверно, PersistentExtension использовать лучше, чтобы после рестарта не терялось сохраненное количество дисплеев. С другой стороны, если вызывать countScreens в startupHook-е для установки правильного значения, то это не нужно (тем не менее, исправил на PersistentExtension).
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

sgfault писал(а):
28.02.2015 17:32
Вообще, я не совсем понял первоначальную задачу: вы хотите использовать XMonad.Layout.PerWorkspace (для 10-го workspace), а также сделать невозможным переключение на 10-й workspace, когда вы находитесь на (допустим) 1-ом Screen-е (те, возможно, XMonad.Layout.IndependentScreens) ? Если так, то не совсем понятно зачем вам вообще XMonad.Layout.LayoutScreens .

Это была первоначальная задумка, как её осуществить я не сообразил, зато наткнулся на XMonad.Layout.LayoutScreens, который мне показался подходящим. Вообще же задумка была такая, чтобы второй монитор можно было использовать для вывода рефов, при этом:

-фреймы на нём автоматически не создаются; --вот этого пока не сделал
-переключение воркспейсов и фокусов окон на основном мониторе никак не затрагивают;
-можно отправить на него фрейм по хоткею.
Спасибо сказали:
yoshakar
Сообщения: 259
ОС: Debian Stretch

Re: Xmonad

Сообщение yoshakar »

[deleted]
Спасибо сказали:
Аватара пользователя
AlexYeCu
Сообщения: 1137
ОС: fedora

Re: Xmonad

Сообщение AlexYeCu »

Можно ли выставить для разных экранов разные воркспейс по умолчанию?
Т.е. по умолчанию рабочий стол 0, включаем второй монитор (через xrandr, к примеру) — там его дефолтный воркспейс.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Xmonad

Сообщение sgfault »

AlexYeCu писал(а):
09.12.2015 21:13
Можно ли выставить для разных экранов разные воркспейс по умолчанию?
Т.е. по умолчанию рабочий стол 0, включаем второй монитор (через xrandr, к примеру) — там его дефолтный воркспейс.

Уточните, пожалуйста, дефолтный воркспейс - это тот, который открывается при включении монитора ? Или еще какие-то команды с ним должны работать?
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Xmonad

Сообщение sgfault »

(upd1)

Впрочем, что тут обсуждать..

Код: Выделить всё

import Data.Monoid
import Control.Applicative

import XMonad
import qualified XMonad.StackSet as W


Определим функцию

Код: Выделить всё

-- Move all elements, matching predicate, to the head of list.
riseElems :: (a -> Bool) -> [a] -> [a]
--riseElems p xs      = filter p xs ++ filter (not . p) xs
riseElems p         = liftA2 (++) (filter p) (filter (not . p))


тогда
1. workspace по умолчанию при запуске xmonad­а можно установить так:
1.1. Поменяв последовательность workspace-ов в поле `workspaces` в XConfig:

Код: Выделить всё

    XConfig
      {
      ..
      , workspaces = riseElems (`elem` ["2", "7"]) $ map show [1..9]
      ..
      }


Недостаток этого способа в том, что порядок [1..9] предполагается при определении клавиш переключения workspace-ов и перемещения окон. Те надо еще исправлять определения 'win + [1..9]', win + shift + [1..9] и тд.

1.2. Явно выбрав workspace-ы в startupHook . Для этого можно использовать такую функцию:

Код: Выделить всё

startupDefaultWorkspaces :: [WorkspaceId] -> X ()
startupDefaultWorkspaces ts = windows $ \ws ->
    let xs = zip ts (map (W.tag . W.workspace) . W.screens $ ws)
    in  foldr (\(x, y) zws -> W.view x . W.view y $ zws) ws xs


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

2. workspace по умолчанию для мониторов, подключаемых во время работы, можно определить, написав свой `ConfigureEvent` event handler, который будет менять последовательность workspace-ов в `hidden` поле StackSet-а (WindowSet-а) : пользовательский event handler запускается перед дефолтным (handle в XMonad/Main.hsc), и дефолтный для ConfigureEvent (изменение конфигурации мониторов) вызывает `rescreen` (XMonad/Operations.hs), который на новые Screen-ы назначает первые неназначенные (`hidden`) workspace-ы.

Код: Выделить всё

defaultWorkspaces :: [WorkspaceId] -> X ()
defaultWorkspaces ts = windows $ \ws@(W.StackSet {W.hidden = hs }) ->
      ws {W.hidden = riseElems ((`elem` ts) . W.tag) hs}

-- Move specified workspaces to the head of `hidden` workspace list at Screen
-- change event. Then `rescreen` (from XMonad/Operations.hs), run by default
-- ConfigureEvent handler (`handle` from XMonad/Main.hsc), will choose first
-- ones from them for displaying on new Screen.
handleDefaultWorkspaces :: [WorkspaceId] -> Event -> X All
handleDefaultWorkspaces ts (ConfigureEvent {ev_window = w}) = do
    whenX (isRoot w) (defaultWorkspaces ts)
    trace "ConfigureEvent"
    return (All True)
handleDefaultWorkspaces _  _    = return (All True)


Использовать этот способ для назначения workspace-ов на не-primary мониторах при старте xmonad-а не получится: несмотря на то, что ConfigureEvent происходят, но к этому времени все доступные Screen-ы уже назначены (при создании StackSet-а функцией `new`).

Upd1.
Забыл написать, как это использовать: чтобы при старте xmonad-а выбирать на первых двух мониторых рабочие столы 2 и 7:

Код: Выделить всё

    XConfig
      {
      ..
      , startupHook = startupDefaultWorkspaces ["2", "7"]
      ..
      }


Чтобы при подключении двух новых мониторов выбирать на них рабочие столы 2 и 7:

Код: Выделить всё

    XConfig
      {
      ..
      , handleEventHook = handleDefaultWorkspaces ["2", "7"]
      ..
      }


В текущей реализации:
- постоянного соответствия между рабочими столами и мониторами нет.
- если на одном из работающих мониторов уже используется один из рабочих столов по умолчанию (допустим, 2), то его в `hidden` уже нет, поэтому на новом мониторе он не включится.

В принципе, все это можно добавить..
Спасибо сказали: