Разделение рабочих пространств в оконном менеджере concept

#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. Думаю, я понял это. Я добавил свой ответ, но есть несколько проблем с моим решением. Любые предложения были бы потрясающими.