#linux #lua #window-managers
#linux #lua #оконные менеджеры
Вопрос:
Я использую диспетчер окон Concept (http://notion.sourceforge.net /) в течение нескольких недель. Мне было интересно, возможно ли создать привязку клавиш, которая разделяет рабочее пространство так же, как META S и META K S разделяют фрейм по горизонтали и вертикали.
Итак, если бы у меня было два вертикальных фрейма в рабочей области, подобной этой:
-----
|1|2|
| | |
| | |
| | |
-----
Привязка клавиш к разделению по горизонтали должна добавить новый фрейм, который охватывает рабочее пространство по горизонтали:
-----
|1|2|
| | |
-----
| 3 |
-----
В настоящее время META S разбивает выбранный фрейм только по горизонтали:
-----
|1|2|
| | |
|-| |
|3| |
-----
Есть ли какой-либо способ выполнить разделение всей рабочей области по горизонтали или вертикали в Notion?
Ответ №1:
Решение, которое я придумал, — добавить привязку клавиш к функции split_top в cfg_tiling.lua. Для разделения по горизонтали я добавил:
kpress(META.."Z", "WTiling.split_top(_, 'bottom')")
к функции WTiling defbindings. Я также добавил
kpress("Z", "Wtiling.split_top(_, 'left')")
для привязок submap META ..»K».
Функция split_top разбивается в корне дерева разделения. Это создаст новый фрейм, который разделяет всю рабочую область, а не текущий фрейм.
Одна из проблем с размером, которую я заметил при таком подходе, заключается в том, что он попытается разделить рабочее пространство ровно пополам. Если есть горизонтальный фрейм, разделяющий рабочее пространство, split_top изменит его размер до наименьшего размера и добавит новый фрейм под ним. Если есть вертикальный фрейм, он станет шириной около 10 пикселей при добавлении нового фрейма. Проблема с горизонтальным размером. Новые фреймы имеют высоту 0:
Start ->Mod1 Z ->Mod1 Z
-1--2-- -1--2-- -1--2--
| | | | | | | | |
| | | | | | | | |
-3----- -3----- -3-----
| | -4----- -4-----
| | | | -5-----
| | | | | |
| | | | | |
------- ------- -------
Проблема с вертикальным размером. Новые фреймы имеют ширину 0:
Start -> Mod1 K Z -> Mod1 K Z
-1----2---- -4--1-2---- -5-41-2----
| | | | || | | ||| |
| | | | || | | ||| |
| |3---| | ||3---| | |||3---|
| | | | || | | ||| |
| | | | || | | ||| |
----------- ----------- -----------
Другая проблема заключается в том, что фокус не меняется на вновь созданный фрейм. Нажатие Mod1 Z создаст фрейм, но пользователь должен Mod1 TAB для фрейма, чтобы управлять им.
Это начало, но комплексное решение будет проверять наличие фреймов, которые уже разделяют рабочее пространство, и вместо этого разделять их и изменять фокус на новый фрейм.
Комментарии:
1. Я считаю, что эти функции должны возвращать созданный ими фрейм. Если это так, то вы должны иметь возможность добавить
:goto_focus()
к этой команде, чтобы переключить фокус на это разделение. Однако я не уверен, что понимаю вашу проблему с размерами.2. Я обновил ответ, чтобы более четко показать проблему с размерами. Я попробую функцию фокусировки позже сегодня.
Ответ №2:
Да, вы можете.
Вам нужно либо поместить свою привязку в контекст рабочей области, либо из контекста frame / mplex вам нужно найти управляющую рабочую область, а затем вызвать split для этого.
(Я бы опубликовал код и более конкретные термины, но в данный момент я не работаю с машиной понятий и не хочу путать вещи, используя неправильные.)
Комментарии:
1. Думаю, я понял это. Я добавил свой ответ, но есть несколько проблем с моим решением. Любые предложения были бы потрясающими.