Xmonad, xmobar. Делимся полезными наработками.

Автор ChubaDuba, 23 января 2018, 15:02:35

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

ChubaDuba

Предлагаю размещать в этой теме у кого что есть интересного по тайловому оконному менеджеру xmonad.

Cообщение объединено 23 Января 2018, 15:18:40

Компоновка окон XMonad.Layout.ThreeColumns
Особенно будет востребована у владельцев ультра широких мониторов.



Cообщение объединено 23 Января 2018, 15:54:25

Коды метеостанций для погодного плагина xmobar.

ChubaDuba

#1
Прозрачность неактивных окон.

Сам этой фишкой не пользуюсь, но может у кого будет востребованной...
Устанавливаем композитный менеджер окон xcompmgr

sudo apt-get install xcompmgr

Добавляем его в автозагрузку, вставив в файл ~/.xinitrc строчку:

xcompmgr -r0 &

Редактируем конфиг xmonad. Добавляем модуль XMonad.Hooks.FadeInactive, удаляем границу у окон, устанавливаем степень непрозрачности:

...
import XMonad.Hooks.FadeInactive
...
...
myConfig = ....
          {...
          ...
          , borderWidth = 0
          , logHook = fadeInactiveLogHook 0.8
          ...
          }
...

Со значением степени непрозрачности можно поиграться и выбрать оптимальное для себя.
Результат:

На скрине calc - активное окно, writer - неактивное окно.

ChubaDuba

#2
Прикручиваем управление аудио плеером MOC и выводим информацию о треке в xmobar.

Для начала определяемся с клавишами. Мой вариант:

"Pause" - пауза/воспроизведение;
mod4Mask + "<" - предыдущий трек;
mod4Mask + ">" - следующий трек.

Определяем keysum для каждой клавиши используя команду:

xev | grep keycode




Вносим изменения в конфиг xmonad:

...
      myKeys = [
                 ...
               , ...
               , ((0                      , 0xff13), spawn "mocp -G")
               , ((mod4Mask,                  0x2e), spawn "mocp -f")
               , ((mod4Mask,                  0x2c), spawn "mocp -r")
               ...
               ...
               ]

Готово!

Скрипт для вывода в xmobar имя исполнителя и названия текущего трека.
Обзавём наш скрипт song:
Открыть содержимое (спойлер)


#! /bin/bash
#

TCOL="#DBDCCC"    # Цвет названия трека при воспроизведении
ACOL="#DBA3A2"    # Цвет исполнителя при воспроизведении
DCOL="#637482"    # Цвет дефиса "-" при воспроизведении
PCOL="#4F4F4F"    # Цвет исполнителя и трека композиции на паузе

MOCSTATE=$(mocp --info | head -n 1 | tail -c +8)

if [ $MOCSTATE == "PLAY" ]; then
  # MOC на воспроизведении
  echo "<fc=$ACOL>$(mocp --info | tail -n +4 | head -n 1 | \
       tail -c +9)</fc> <fc=$DCOL>-</fc> <fc=$TCOL>$(mocp --info | \
       tail -n +5 | head -n 1 | tail -c +12)</fc>"

elif [ $MOCSTATE == "PAUSE" ]; then
  # MOC на паузе
  echo "<fc=$PCOL>$(mocp --info | tail -n +4 | head -n 1 | \
       tail -c +9) - $(mocp --info | tail -n +5 | head -n 1 | tail -c +12)</fc>"
fi

[свернуть]
Добавляем вывод скрипта в xmobar. Правим конфиг xmobar'а:

...
        commands = [
                    ...
                    ...
                    Run Com "<указываем_путь_до_нашего_скрипта>" [] "song" 10,
                    ...
                   ]

...
...
, template = "%StdinReader% }{%song% .....................}
                         

Результат:
На воспроизведении:

На паузе:





ChubaDuba

#3
Меню программ для Xmonad.

Вариантов существует много. Мне импонирует MyGtkMenu:
 

dogsleg

#4
Системный лоток

Смотрю, пошёл не только xmonad, но и сопутствующее...

В качестве системного лотка использую trayer:


Тут в лотке висят GNU Ring, Google Hangouts, Dropbox. Запущен с помощью следующей команды:

/usr/bin/trayer --edge top --align right --SetDockType true --SetPartialStrut true  --expand true --width 10 --transparent true --tint 0x000000 --alpha 0 --height 17 --distance 460 --distancefrom right &

Cообщение объединено 27 января 2018, 21:03:50

Запоминание раскладки для каждого окна

Мне не нравится, когда раскладка переключается глобально, для меня удобнее, чтобы у разных окон были разные раскладки. Соответственно, раскладка для некоторого данного окна должна запоминаться. Это можно сделать в xmonad с помощью пакета xmonad-extras, который есть и в Debian (да-да, этот пакет в Debian когда-то загрузил я ;) ).

Соответственно, в настройки xmonad надо добавить что-то типа:


...
import XMonad.Hooks.PerWindowKbdLayout
...
main = xmonad defaultConfig { handleEventHook = perWindowKbdLayout }


У меня это сделано конкретно так:


...
import XMonad.Hooks.PerWindowKbdLayout
...
main = do
    ...
    xmonad $ ewmh $ defaultConfig
        { ...
        , handleEventHook    = mconcat
                               [ perWindowKbdLayout
                               , docksEventHook
                               , handleEventHook defaultConfig ]

ChubaDuba

#5
Цитата: dogsleg от 27 января 2018, 20:50:48Запоминание раскладки для каждого окна
Добавлю ещё один рабочий вариант:
Устанавливаем пакет kbdd

sudo apt-get install kbdd

Добавляем в автозагрузку, вставив в файл ~/.xinitrc строчку:

kbdd &

Пользуемся.

ChubaDuba

#6
Иконки для Workspaces'ов в xmobar.

Понадобится шрифт с иконками. Я использую Terminus Re33 Nerd
Для определения unicode values наших иконок можно использовать вот этот ресурс.

Редактируем конфиг xmonad:

Вот так теперь отображаются имена Workspaces'ов в xmobar'е:


P.S. В конфиге xmobar'а тоже нужно прописать шрифт:

Config { font = "xft:Terminus Re33 Nerd:size=14:weight=bold:antialias=true:hinting=true"
       , additionalFonts = [ "xft:Terminus Re33 Nerd:size=14:weight=bold:antialias=true:hinting=true" ]
...
...

ChubaDuba

#7
Компоновка окон XMonad.Layout.IM для клиента мгновенных сообщений.
Сам я использую в качестве клиента Tkabber, но думаю, что можно настроить и для Psi+ и Gagim.

Добавляем в конфиг xmonad:

...
...
import XMonad.Layout.IM
import Data.Ratio ((%))
...
...
myLayout = withIM (1%7) (ClassName "Tkabber") Grid ||| ...
...

Как всё это выглядит:

ChubaDuba

#8
Уровень громкости для xmobar
Музыку послушать любим, поэтому фишка очень востребованная...
Так как у меня в хозяйстве моноблок, то хотелось видеть в xmobar не только текущий уровень звука, но и канал по которому он идёт.
Скрипт, который всё это будет выводить нам в xmobar. Обзавём его vol:
Открыть содержимое (спойлер)


#!/bin/bash
#

vol=$(amixer get Master | awk -F'[]%[]' '/%/ {if ($7 == "off") \
{ print "MM" } else { print $2 }}' | head -n 1)

COLOR="#DBA3A2"
volume="[on]"

Volume_s="`amixer get Speaker Playback Volume | sed '6!d' | \
         sed -r 's/^[^B]+//' | sed -r 's/^[^[]+//'`"

Volume_h="`amixer get Headphone Playback Volume | sed '6!d' | \
         sed -r 's/^[^B]+//' | sed -r 's/^[^[]+//'`"

if [[ $Volume_s == *"$volume"* ]] && [[ $Volume_h != *"$volume"* ]]; then
   echo "<fc=#8CD0D3>vol.</fc><fc=$COLOR>(d)</fc><fc=#8CD0D3>$vol%</fc>"
fi

   if [[ $Volume_s == *"$volume"* ]] && [[ $Volume_s == *"$volume"* ]]; then
   echo "<fc=#8CD0D3>vol.</fc><fc=$COLOR>(dh)</fc><fc=#8CD0D3>$vol%</fc>"
   fi

      if [[ $Volume_s == *"$volume"* ]] && [[ $Volume_h != *"$volume"* ]]; then
         echo "<fc=#8CD0D3>vol.</fc><fc=$COLOR>(d)</fc><fc=#8CD0D3>$vol%</fc>"
      else
           if [[ $Volume_h == *"$volume"* ]]; then
              echo "<fc=#8CD0D3>vol.</fc><fc=$COLOR>(h)</fc><fc=#8CD0D3>$vol%</fc>"   
           else
              echo "<fc=#8CD0D3>vol.MM</fc>"
           fi
      fi

exit 0

[свернуть]

Добавляем вывод скрипта в xmobar:

commands = [
           ...
           ...
           Run Com "/путь_до_скрипта/vol" [] "vol" 10,
           ...
           ...
           ]
...
...
           , template = " %StdinReader% }{ ... ...%vol% ... ... }


Получаем в xmobar:

где
(d) - выход через динамики;
(h) - выход через наушники;
MM - звук выключен (Mute).

Вешаем управление громкостью на предварительно выбранные клавиши. Редактируем конфиг xmonad:


...
...
myKeys = [
         ...
         , ((0                          , 0x1008ff11), spawn "amixer set Master 2-")
         , ((0                          , 0x1008ff13), spawn "amixer set Master 2+")
         , ((0                          , 0x1008ff12), spawn "amixer set Master toggle")
         ...
         ]
...
...

Ну и до кучи, чтобы не лазить в alsamixer и не передёргивать в нём каналы ещё один скрипт для быстрого переключения между каналами:
Открыть содержимое (спойлер)


#! /bin/bash
#
# Скрипт, переключающий источник звука alsa.
# С колонок на наушники и наоборот.

volume="[on]"

Volume_s="`amixer get Speaker Playback Volume | sed '6!d' | \
         sed -r 's/^[^B]+//' | sed -r 's/^[^[]+//'`"
         
Volume_h="`amixer get Headphone Playback Volume | sed '6!d' | \
         sed -r 's/^[^B]+//' | sed -r 's/^[^[]+//'`"

if [[ $Volume_s == *"$volume"* ]] && [[ $Volume_s == *"$volume"* ]]; then
   amixer sset Headphone mute
   amixer sset Speaker unmute
fi


if [[ $Volume_s == *"$volume"* ]] && [[ $Volume_h != *"$volume"* ]]; then
   amixer sset Headphone unmute
   amixer sset Speaker mute
else

     if [[ $Volume_h == *"$volume"* ]]; then
        amixer sset Headphone mute
        amixer sset Speaker unmute
     fi
fi

exit 0

[свернуть]
Его выполнение вешаем на клавишу как и в случае с громкостью, внося изменения в конфиг xmomad.

Ogis1975

Приветствую знатоков Xmonad и haskel. У меня один вопрос. Настроил Xmonad под себя. Все работает. Посмотрел в файл xmonad.errors. А там такая надпись-
Открыть содержимое (спойлер)
xmonad.hs:132:9: warning: [-Wtabs]
    Tab character found here, and in three further locations.
    Please use spaces instead.
[свернуть]
Гуглил, и нашел, что нужно настроить свой ide, чтобы вместо табов, использовались space. Настроил, но ошибка все равно вылезла. Как я понимаю, нужно править ручками, но как? Я в haskel понимаю чуть больше, чем ноль. Как это победить? В принципе не критично, но хочется исправить...

qupl


Ogis1975

Цитата: qupl от 13 февраля 2018, 21:51:51
Заменить символы Tab на пробелы.
Ну так это понятно, но как их определить?

ChubaDuba

Так а что там у вас в 132-ой строчке xmonad.hs?

qupl

Цитата: Ogis1975 от 13 февраля 2018, 22:40:40Ну так это понятно, но как их определить?
Открыть текстовым редактором, в  mc просмотрщик по F4 показывает hex-коды.

Ogis1975

#14
Цитата: ChubaDuba от 13 февраля 2018, 23:34:35
Так а что там у вас в 132-ой строчке xmonad.hs?
Вот весь масив
Открыть содержимое (спойлер)
-- xmobar setting
           , logHook                = myLogHook wsbar
                                         >> updatePointer (0.5,0.5) (0,0)
          , handleEventHook   = fullscreenEventHook <+> docksEventHook
          , workspaces           = myWorkspaces
          , modMask              = modm
          , mouseBindings      = newMouse
          }   
[свернуть]