Title: Еще одна заметка о тайлинге
Author: Viva Calman
Date: 2023-05-28 14:47:03
Correction code: 168527468051323

2023-05-23-125938<em>1920x1080</em>scrot.png

В предыдущей заметке я написал про организацию тайлинга в Windows, теперь же будет короткая заметка про еще одну маленькую доработку моего верного FVWM.

В данном случае пример показан на моей рабочей машине, так как я за ней провожу большую часть своих будних дней.

В принципе, в FVWM уже есть встроенный механизм тайлинга, который вызывается командой FvwmRearrange. Данная команда, как можно убедиться из man-страницы, умеет так ресайзить окна, чтобы они укладывались в равномерную сетку заданной размерности. Это неплохо работает, когда надо разбить окна в конфигурации "два столбца", хотя мне уже давно стало привычным сразу бросать окно в нужный угол с помощью давно прописанных хоткеев. Это может быть и не так быстро, как автоматический тайлинг, но стало привычным и больших проблем не вызывает. Тем более виртуальные рабочие столы в FVWM работают куда лучше их аналогов в Windows, а это значит, что я легко распределяю окна по рабочим пространствам, группируя их по задачам.

Но, как я уже писал, самой удобной формой раскладки для большинства случаев (кроме, наверное, терминалов), для меня является раскладка 2:1. И вот эта раскладка до недавнего времени у меня реализована не была. Но начав заниматься тайлингом на домашней машине, я решил, что мне надо сделать подобное и на работе. Как и прежде, заморачиваться с автоматической организацией окон я не стал, ограничившись, во-первых, выделением хоткеев на функции "отправить в такой то угол/сторону экрана", во-вторых, ограничился лишь вариантом "широкое окно слева", в-третьих, что самое важное, наконец то вынес все размеры окон в переменные, которые инициализируются специальным скриптом, исходя из заданного разрешения экрана, высоты щели между окнами и нижним краем экрана (используется для переключения рабочих столов колесиком мышки. Просто уводишь мышь вниз до упора и крутишь колесе. Ну и заодно меню можно вызвать) и ширины панели.

В первом варианте это все было захардкожено в конфиге, но у меня данная конфигурация WM универсальна для всех машин, а значит ей нужна гибкость.

К счастью, FVWM обладает встроенным модулем perl, что решает, наверное, 99.9999% проблем, особенно для меня, как для любителя этого языка программирования. Скрипт вызывается вот так. CalcPerl — это имя инстанса "перл-процессора", который обрабатывает запросы. Я решил выделить для управлением окнами отдельный инстанс, ну просто на всякий случай. Какой-то большой нужды в этом нет

Module FvwmPerl CalcPerl
SendToModule CalcPerl load $[fvwm_script]/FvwmWindowsSizeCalculate.pl

Сам скрипт написан по методу "в лоб", никакой магии там нет

#!/usr/bin/perl

use Env;
use warnings;
use strict;

# Здесь я забираз значения из переменных окружения, установленных FVWM. 
# Возможно, излишество, но мне так проще

my $SCREEN_HEIGHT = $FVWM_SCREEN_HEIGHT;
my $SCREEN_WIDTH = $FVWM_SCREEN_WIDTH;
my $BOTTOM_MARGIN = $FVWM_BOTTOM_MARGIN;
my $PANEL_WIDTH = $FVWM_PANEL_WIDTH;

my $WORK_WIDTH = $SCREEN_WIDTH - $PANEL_WIDTH;
my $WORK_HEIGHT = $SCREEN_HEIGHT - $BOTTOM_MARGIN;
my $WORK_RIGHT_HALF = int($WORK_WIDTH / 2);
my $WORK_THIRD = int($WORK_WIDTH / 3);
my $WORK_TWO_THIRDS = $WORK_THIRD * 2;
my $WORK_HALF = $WORK_HEIGHT / 2;

# cmd("string") работает, как вызов команды FVWM из конфига. 
# Словно в этом месте вызов скрипта заменился на эти команды

cmd("SetEnv FVWM_HEIGHT_LIMIT ${WORK_HEIGHT}p");
cmd("SetEnv FVWM_RIGHT_HALF ${WORK_RIGHT_HALF}p");
cmd("SetEnv FVWM_TWO_THIRDS ${WORK_TWO_THIRDS}p");
cmd("SetEnv FVWM_ONE_THIRD ${WORK_THIRD}p");
cmd("SetEnv FVWM_HALF ${WORK_HALF}p");
cmd("SetEnv FVWM_PANEL_SPACE -${PANEL_WIDTH}p");

В отдельном конфиге уже реализованы сами функции FVWM. Функции, которые разворачивают окно по углам:

DestroyFunc MaximizeToTRCThird
AddToFunc MaximizeToTRCThird
+ I Maximize true $[FVWM_ONE_THIRD] $[FVWM_HALF]
+ I Move $[FVWM_TWO_THIRDS] 0

DestroyFunc MaximizeToTLCThird
AddToFunc MaximizeToTLCThird
+ I Maximize true $[FVWM_TWO_THIRDS] $[FVWM_HALF]
+ I Move 0 0

DestroyFunc MaximizeToBRCThird
AddToFunc MaximizeToBRCThird
+ I Maximize true $[FVWM_ONE_THIRD] $[FVWM_HALF]
+ I Move $[FVWM_TWO_THIRDS] $[FVWM_HALF]

DestroyFunc MaximizeToBLCThird
AddToFunc MaximizeToBLCThird
+ I Maximize true $[FVWM_TWO_THIRDS] $[FVWM_HALF]
+ I Move 0 $[FVWM_HALF]

И функции, разворачивающие окно во всю высоту, по стороне экрана

DestroyFunc MaximizeToLeftHalfThird
AddToFunc MaximizeToLeftHalfThird
+ I Maximize true $[FVWM_TWO_THIRDS] $[FVWM_HEIGHT_LIMIT]
+ I Move 0 0

DestroyFunc MaximizeToRightHalfThird
AddToFunc MaximizeToRightHalfThird
+ I Maximize true $[FVWM_ONE_THIRD] $[FVWM_HEIGHT_LIMIT]
+ I Move $[FVWM_TWO_THIRDS] 0

Как можно убедиться, никакой магии, скорее даже полный примитивизм, с простором для оптимизации. Но должен признаться, я в очередной раз задумался "а почему я не сделал этого раньше?"

2023-05-23-130151<em>1920x1080</em>scrot.png

^HOME