Моё знакомство с WM Awesome. Часть 3

в 12:02, , рубрики: awesome, gentoo, linux, urxvt, Графические оболочки, оконный менеджер, метки: , , , ,

Третья часть моего поста (предыдущую можно найти тут)

В этом кусочке назначаем кнопки мыши и клавиатуры. Небольшое примечание: для Mod4 + PrntScr я назначил делать скриншот выделенной области, а на просто PtntScrn скриншот всего экрана, но второй случай не работает — не доходят руки разобраться (для скриншотов вам понадобится установить пакет xsnap

Назначение кнопок и комбинаций
-----------------------------------
--- Назначения мыши ---
-----------------------------------
root.buttons(awful.util.table.join(
   -- Правая кнопка - вызов меню
   awful.button({ }, right_button, function() main_menu:toggle() end),
   -- Боковые кнопки - переключение тэгов по порядку
   awful.button({ }, plus_button, awful.tag.viewnext ),
   awful.button({ }, minus_button, awful.tag.viewprev )
))

-------------------------------------------
--- Назначения клавиатуры ---
-------------------------------------------
-- Глобальные назначения клавиш
globalkeys = awful.util.table.join(
  -- Переключение рабочих столов
  awful.key( { modkey,			}, key_Left, awful.tag.viewprev ),
  awful.key( { modkey,			}, key_Right, awful.tag.viewnext ),
  awful.key( { modkey,			}, key_Esc, awful.tag.history.restore ),
  --awful.key( {                          }, key_Alt_R, function () kbdcfg.switch() end),
  -- Манипуляция областями экрана (перестановка клиентов)
  awful.key( { modkey,			}, key_Tab,
  function()
    awful.client.focus.history.previous()
    if client.focus then client.focus:raise() end
  end ),
  -- Запуск стандартных программ
  -- Терминал
  awful.key( { modkey,			}, key_X, function() awful.util.spawn(terminal) end ),
  -- Командная строка
  awful.key( { modkey,			}, key_R, function() bottom_prompt_box[mouse.screen]:run() end ),
  awful.key( { 		 	        }, key_Home, function() awful.util.spawn_with_shell("google-chrome-stable") end ),
  -- Перезапуск awesome
  awful.key( { modkey,	"Control"	}, key_R, awesome.restart),
  awful.key( { modkey                   }, key_F1, function () awful.util.spawn('slimlock') end),
  awful.key( {        	                }, key_Print,
	  function () awful.util.spawn_with_shell("DATE=`date +%d%m%Y_%H%M%S`; xsnap -file $HOME/Snapshots/snap$DATE") end),
  awful.key( { modkey  	                }, key_Print,
	  function () awful.util.spawn_with_shell("DATE=`date +%d%m%Y_%H%M%S`; xsnap -nogui -file $HOME/Snapshots/snap$DATE") end),
  awful.key( {			        }, key_Vol_Up, function () volumecfg.up() end),
  awful.key( { 			        }, key_Vol_Down, function () volumecfg.down() end),
  awful.key( {                          }, key_Mute, function () volumecfg.toggle() end)
)

------------------------------------------------------
--- Клиентские назначения клавиш ---
------------------------------------------------------
clientkeys = awful.util.table.join(
  -- РАзвернуть на весь экран
  awful.key( { modkey,			}, key_F, 	function(c) c.fullscreen = not c.fullscreen end ),
  -- Закрыть окно
  awful.key( { modkey,	"Shift"		}, key_C, 	function(c) c:kill() end ),
  -- Перевести окно  в плавающий режим
  awful.key( { modkey,	"Control"	}, key_Space, 	awful.client.floating.toggle ),
  -- Сделать данной клиентское окно главным
  awful.key( { modkey,	"Control"	}, key_Return, 	function(c) c:swap( awful.client.getmaster() ) end ),
  -- Переместить окно на другой экран???
  awful.key( { modkey,			}, key_O, 	awful.client.movetoscreen ),
  -- Поместить окно поверх всех
  awful.key( { modkey,			}, key_T, 	function(c) c.ontop = not c.ontop end ),
  -- Минимизировать окно
  awful.key( { modkey,			}, key_N,
  function(c)
    c.minimized = true
  end ),
  -- Максимизировать окно
  awful.key( { modkey,			}, key_M,
  function(c)
    c.maximized_horizontal = not c.maximized_horizontal
    c.maximized_vertical = not c.maximized_vertical
  end )
)

Здесь определены некоторые комбинации для тегов, роли и сигналы. Например пиджин у меня открывается только на 4 теге, а в сигнала я прописываю — отображать у окон кнопку развернуть, закрыть, иконку и заголовок окна.

Комбинации для окон, правила и сигналы

-----------------------------------------------------------------------------------------------------------------------
--- Переключение тэгов и операции с клиентами и тэгами на каждом из экранов ---
-----------------------------------------------------------------------------------------------------------------------
for i = 1, 9 do
  -- modkey + <номер тэга>
  -- Переключиться в выбранный тэг
  globalkeys = awful.util.table.join( globalkeys,
    awful.key({ modkey }, "#" .. i + 9,
    function()
	local screen = mouse.screen
	local tag = awful.tag.gettags(screen)[i]
	if tag then
	  awful.tag.viewonly(tag)
	end
    end),
    -- modkey + Ctrl + <номер тэга>
    -- Совместить выбранный тэг с текущим
    awful.key({ modkey, "Control" }, "#" .. i + 9,
    function()
	local screen = mouse.screen
	local tag = awful.tag.gettags(screen)[i]
	if tag then
	  awful.tag.viewtoggle(tag)
	end
    end),
    -- modkey + <номер тэга>
    -- Переместить клиент в фокусе на выбранный тэг
    awful.key({ modkey, "Shift" }, "#" .. i + 9,
    function()
	local tag = awful.tag.gettags(client.focus.screen)[i]
	if client.focus and tag then
	  awful.client.movetotag(tag)
	end
    end),
    -- modkey + <номер тэга>
    -- Переместить клиент в фокусе на выбранный тэг, оставив его и в текущем тэге
    awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
    function()
	local tag = awful.tag.gettags(client.focus.screen)[i]
	if client.focus and tag then
	  awful.client.toggletag(tag)
	end
    end)
  )
end

----------------------------------------------------------------------------
--- Назначение кнопок мыши для каждого клиента ---
----------------------------------------------------------------------------
clientbuttons = awful.util.table.join(
  -- Переключить фокус
  awful.button( { }, left_button, function(c) client.focus = c; c:raise() end),
  -- Переместить
  awful.button( { modkey }, left_button, awful.mouse.client.move),
  -- Изменить размер
  awful.button( { modkey }, right_button, awful.mouse.client.resize)
 )


-- Задать глобальные клавиши
root.keys(globalkeys)

----------------------------------
--- Роли приложений ---
----------------------------------
awful.rules.rules = {
  { -- Главная роль для всех приложений
    rule = { },
    properties = { border_width = beautiful.border_width, -- задается толщина рамки окна
		   border_color = beautiful.border_normal, -- цвет рамки окна не в фокусе
		   focus = awful.client.focus.filter, -- это что не знаю :(
		   keys = clientkeys, -- горячие клавиши
		   buttons = clientbuttons} -- кнопки мыши
  },
  --{ rule = { class = "MPlayer" },
  --   properties = { floating = true } },
   --{ rule = { class = "pinentry" },
  --   properties = { floating = true } },
   --{ rule = { class = "Gimp" },
  --   properties = { floating = true } },
   -- Set Firefox to always map on tags number 5 of screen 1.
   --{ rule = { class = "Firefox" },
  --   properties = { tag = tags[1][5] } }
-- "Коньки": без рамки и плавать
  {
    rule = { class = "Conky"},
    properties = { border_width = 0, floating = true }
  },
  {
    rule = { instance = "Pidgin" },
    properties = { tag = tags[1][4], floating = false, maximized_horizontal = false, maximized_vertical = false }
  },
  {
    rule = { instance = "Skype" },
    properties = { floating = true, maximized_horizontal = false, maximized_vertical = false }
  }
}

--------------------
--- Сигналы ---
--------------------
client.connect_signal("manage", 
   function (c, startup)
   -- Enable sloppy focus
      c:connect_signal("mouse::enter", 
      function(c)
         if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
         and 
            awful.client.focus.filter(c) 
         then
            client.focus = c
         end
      end)
      if
         not startup 
      then
         -- Set the windows at the slave,
         -- i.e. put it at the end of others instead of setting it master.
         -- awful.client.setslave(c)
         -- Put windows in a smart way, only if they does not set an initial position.
         if
            not c.size_hints.user_position 
         and 
            not c.size_hints.program_position 
         then
            awful.placement.no_overlap(c)
            awful.placement.no_offscreen(c)
         end
      end
end)

-- У окон в фокусе
client.connect_signal("focus",
   function(c)
    -- Раскрасить рамку соответствеено
    c.border_color = beautiful.border_focus
    -- Нарисовать заголовок окна
    -- Виджет слева от заголовка окна
    local left_layout = wibox.layout.fixed.horizontal()
    left_layout:add(awful.titlebar.widget.iconwidget(c))
    -- Виджеты в правой части заголовка окна
    local right_layout = wibox.layout.fixed.horizontal()
    --right_layout:add(kbdcfg.widget)
    right_layout:add(awful.titlebar.widget.maximizedbutton(c))
    right_layout:add(awful.titlebar.widget.closebutton(c))
    -- Заголовок окна
    local middle_layout = wibox.layout.flex.horizontal()
    local title = awful.titlebar.widget.titlewidget(c)
    title:set_align("center")
    middle_layout:add(title)
    -- Расставляем блоки виджетов по местам
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
    layout:set_right(right_layout)
    layout:set_middle(middle_layout)
    -- Добавляем их на заголовок окна
    awful.titlebar(c):set_widget(layout)
    -- Задаем размер заголовка окна
    awful.titlebar(c, {size = 18})
   end)
client.connect_signal("unfocus",
   function(c)
    c.border_color = beautiful.border_normal
    awful.titlebar(c, {size = 18})
   end)

Переключение раскладок.

Сразу скажу, что стоит откатиться xkbcomp до версии 1.2.3, так как в 1.2.4 есть баг (при переключении раскладки, не работают кнопки мыши)

Про раскладку вообще, можно добавить реализацию как это в gentoo wiki написанно, но тогда у нас не буду работать горячии клавиши (для системных мы указывали коды клавиш, так что это нам не страшно), а вот такие как ctrl + C и т.д. работать не будут.

в новых версиях Xorg сервера убрали xorg.conf, теперь конфигурация лежит в другом месте. Создадим директорию
sudo mkdir /etc/X11/xorg.conf.d

И в ней создадим 2 файла, 01-keyboard-layout.conf и 01-enable-pointerkeys.conf
В первом:

Section "InputClass"
	Identifier             "keyboard-layout"
	MatchIsKeyboard        "on"
	Option "XkbLayout" "us,ru"
	Option "XkbOptions" "grp:ctrl_shift_toggle,terminate:ctrl_alt_bksp
EndSection

Перезапуск X сервера комбинацией ctrl + alt + backspace и смена раскладки с помощью ctrl + shift

После смены раскладки у нас по умолчанию отключаются кнопки мыши, по этому для их включения запишем во втором (при версии xkbcomp-1.2.4 это не работает):

Section "InputClass"
    Identifier             "Keyboard Defaults"
    MatchIsKeyboard        "yes"
    Option                 "XkbOptions" "keypad:pointerkeys"
EndSection

Теперь сделаем приятным для глаз наш urxvt, для этого отредактируем файлик ~/.Xdefaults (опять таки, если его нету — смело создаём)

Мой ~/.Xdefaults

!darkgray
*background:		#212121

!silver
*foreground:		#C0C0C0

!black
*color0:		#251f1f
*color8:		#5e5e5e
!red
*color1:		#eb4509
*color9:		#eb4509
!green
*color2:		#94e76b
*color10: 		#95e76b
!yellow
*color3:		#ffac18
*color11: 		#ffac18
!blue
*color4:		#46aede
*color12:		#46aede
!magenta
*color5:		#e32c57
*color13:		#e32c57
!cyan
*color6:		#d6dbac
*color14:		#d6dbac
!white
*color7:		#efefef
*color15:		#efefef

!save 5000 lines
URxvt*saveLines:	5000	

!left button
URxvt.matcher.button:   1	

!default brauser google chrome
URxvt.urlLauncher:	google-chrome-stable
!underline links
URxvt.underlineURLs:	true
!	
URxvt.keysym.M-u:	perl:url-select:select_next

!disabled button 'new tab'
URxvt.tabbed.new-button:no
!?
URxvt.tabbed.tabbar-fg: 15
!?
URxvt.tabbed.tabbar-bg: 8
!?
URxvt.tabbed.tab-fg:    8
!?
URxvt.tabbed.tab-bg:    14

Rxvt.font: -misc-fixed-medium-r-normal--15-140-75-75-c-90-iso8859-1
URxvt.boldFont: -misc-fixed-bold-r-normal--15-140-75-75-c-90-iso8859-1
!disable scrollbar
URxvt*scrollBar:       	false	

В итоге получаем приятную для глаз цветовую схему нашего терминала.

В итоге получаем вот такую приятную и весьма удобную систему:
Моё знакомство с WM Awesome. Часть 3
Моё знакомство с WM Awesome. Часть 3
Моё знакомство с WM Awesome. Часть 3

Конечно я не достиг такого уровня, как unlogic и мой конфиг ещё можно совершенствовать до бесконечности, но я получил удобную и работоспособную систему.

P.S. В emacs у меня цветовая схема monokai.
P.P.S. Надеюсь ничего не забыл описать.

Автор: worm2fed

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js