LINUX.ORG.RU

Избранные сообщения schlae

Помогите допилить управлялку расположения и геометрии клиентов с клавиатуры

Форум — Desktop

Год и два года назад как-то поднимал уже эту тему, но не срослось.

Демка гифка, чтобы не читать много текста ниже: http://i.imgur.com/cpKRBXM.gif

Подробнее: управлять размещением клиента, а именно размещать его по частям текущего дисплея при этом подгоняя его геометрию.

Например: есть фокус-клиент, я нажимаю на mod4 + 9 на нампаде, т.е. верхнюю правую кнопку (KP_Prior), что означает, что клиент должен переместиться в верхний правый угол текущего дисплея и иметь геометрию четверти дисплея:

+---------------------+  +---------------------+  +---------------------+
| +---------+         |  | +-----------------+ |  |         +---------+ |
| |    7    |         |  | |         8       | |  |         |    9    | |
| |         |         |  | |                 | |  |         |         | |
| +---------+         |  | +-----------------+ |  |         +---------+ |
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
+---------------------+  +---------------------+  +---------------------+
+---------------------+  +---------------------+  +---------------------+
| +---------+         |  | +-----------------+ |  |         +---------+ |
| |         |         |  | |                 | |  |         |         | |
| |         |         |  | |                 | |  |         |         | |
| |    4    |         |  | |        5        | |  |         |    6    | |
| |         |         |  | |                 | |  |         |         | |
| |         |         |  | |                 | |  |         |         | |
| |         |         |  | |                 | |  |         |         | |
| +---------+         |  | +-----------------+ |  |         +---------+ |
+---------------------+  +---------------------+  +---------------------+
+---------------------+  +---------------------+  +---------------------+
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
|                     |  |                     |  |                     |
| +---------+         |  | +-----------------+ |  |         +---------+ |
| |    1    |         |  | |         2       | |  |         |    3    | |
| |         |         |  | |                 | |  |         |         | |
| +---------+         |  | +-----------------+ |  |         +---------+ |
+---------------------+  +---------------------+  +---------------------+
Управление кнопками нампада в целом такое (расположение / геометрия), mod4+:

  • 1  — левый нижний угол / пол длины / пол высоты
  • 2  — нижняя часть / вся длина / пол высоты
  • 3  — правый нижний угол / пол длины / пол высоты
  • 4  — левая часть / пол длины / вся высота
  • 5  — максимизация (типа mod4+M, но без переключения режима floating)
  • 6  — правая часть / пол длины / вся высота
  • 7  — левый верхний угол / пол длины / пол высоты
  • 8  — верхняя часть / вся длина / пол высоты
  • 9  — верхний правый угол / пол длины / пол высоты

Для одно-мониторной конфигурации я запилил уже давно:

local wa = screen[mouse.screen].workarea -- текущий screen
local ph = 22 -- высота панели
local ww = wa.width -- длина текущего screen
local wh = wa.height -- высота текущего screen

clientkeys = awful.util.table.join(

awful.key({modkey}, "KP_Left",  function (c) c:geometry( { width = ww / 2, height = wh, x = 0, y = ph } ) end),
awful.key({modkey}, "KP_Right", function (c) c:geometry( { width = ww / 2, height = wh, x = ww / 2, y = ph } ) end),
awful.key({modkey}, "KP_Up",    function (c) c:geometry( { width = ww, height = wh / 2, x = 0, y = ph } ) end),
awful.key({modkey}, "KP_Down",  function (c) c:geometry( { width = ww, height = wh / 2, x = 0, y = wh / 2 + ph } ) end),
awful.key({modkey}, "KP_Prior", function (c) c:geometry( { width = ww / 2, height = wh / 2, x = ww / 2, y = ph } ) end),
awful.key({modkey}, "KP_Next",  function (c) c:geometry( { width = ww / 2, height = wh / 2, x = ww / 2, y = wh / 2 + ph } ) end),
awful.key({modkey}, "KP_Home",  function (c) c:geometry( { width = ww / 2, height = wh / 2, x = 0, y = ph } ) end),
awful.key({modkey}, "KP_End",   function (c) c:geometry( { width = ww / 2, height = wh / 2, x = 0, y = wh / 2 + ph } ) end),
awful.key({modkey}, "KP_Begin", function (c) c:geometry( { width = ww, height = wh, x = 0, y = ph } ) end),

)
Всё отлично работает, но когда два дисплея, начиная каша малаша, почему-то не хочет считать геометрию и расположение фокусного скрина, от чего плясать нужно? Не screen[mouse.screen]? Тогда что? Помогите допилить, может и вам (это очень удобно, отвечаю!) пригодится и вашим родственникам и друзьям.

sudo cast actionless, Worron, fjfalcon, zhuravlik, Faiver, r3lgar; (простие, если вы бог осома, а я вас запамятовал).

Спасибо.

 , ,

kep
()