Вопрос или проблема
В данный момент я использую установку Linux Mint 22 Cinnamon 6.2.9, которая установлена пару дней назад, и я хочу использовать некоторые функции, которые у меня были в предыдущем оконном менеджере с тайлингом в XFCE. В частности, я хочу перемещать плавающие окна с помощью сочетаний клавиш. Чтобы сделать это, я написал краткий Bash скрипт:
#!/bin/sh
win_id=`xdotool getactivewindow`
u=`xwininfo -id $win_id | grep 'Absolute upper-left X' | cut -c27-35`
v=`xwininfo -id $win_id | grep 'Absolute upper-left Y' | cut -c27-35`
(( u+=150, v=$v-86 ))
xdotool getactivewindow windowmove $u $v
Он предназначен для перемещения плавающего окна на 150 пикселей по оси X (86 пикселей, которые я вычитаю из оси Y, — это верхняя часть декорации окна, которая учитывается программой xwininfo
, но не программой windowmove
.
Когда я выполняю его в терминале, он работает нормально, но когда я пытаюсь привязать его к какому-нибудь сочетанию клавиш (например, Super + G), выбранное окно перемещается только на +86 пикселей по оси Y.
Может ли кто-нибудь это воспроизвести? Что могло бы быть причиной этого несоответствия? Я уже проверил, что другие скрипты с привязкой к клавишам выполняются корректно (например, открытие других программ).
Ответ или решение
Для пользователя, который столкнулся с проблемой перемещения плавающих окон с помощью клавиатурных сокращений в системе Linux Mint 22 с использованием среды рабочего стола Cinnamon 6.2.9, решение может быть несколько комплексным, и я постараюсь подробно рассказать об этом вопросе.
Для начала, кратко опишу, что вы пытаетесь сделать: вы хотите реализовать функциональность, позаимствованную из менеджера окон типа "tiling", используя сценарий на Bash для перемещения активного окна по осям X и Y на заданное количество пикселей. Однако, возникает проблема, когда сценарий, привязанный к комбинации клавиш, работает некорректно по сравнению с его запуском напрямую из терминала.
1. Анализ проблемы:
Сценарий и его запуск: При выполнении вашего Bash скрипта вручную в терминале он выполняется корректно. Проблемы возникают, когда вы привязываете его к клавиатурному сокращению. Основной аномалией является смещение окна вдоль оси Y на 86 пикселей, даже если по сути вы пытаетесь уменьшить положение по оси Y на это значение.
Потенциальные точки отказа:
- Обработка входных данных скрипта: Возможно, скрипт обрабатывается по-разному при запуске из терминала и через менеджер горячих клавиш.
- Доступ к переменным и контекст среды: Когда скрипт запущен через сочетание клавиш, он может иметь иной доступ к окружению.
- Права доступа: Менеджер контекстов рабочего стола может ограничивать права доступа при автоматическом выполнении сценария.
2. Рекомендации по решению:
Проверка доступа:
- Убедитесь, что в скрипте также заданы права на выполнение (
chmod +x script.sh
).
Отладка и диагностика:
- Добавьте логирование в ваш скрипт, чтобы видеть, какие значения переменных
u
иv
получены. Это можно сделать с помощью командыecho
.
Изменение скрипта:
#!/bin/bash
win_id=$(xdotool getactivewindow)
coords=$(xwininfo -id $win_id)
u=$(echo "$coords" | grep 'Absolute upper-left X' | awk '{print $NF}')
v=$(echo "$coords" | grep 'Absolute upper-left Y' | awk '{print $NF}')
(( u+=150 ))
(( v-=86 ))
xdotool windowmove $win_id $u $v
# Логирование
echo "Window ID: $win_id, New X: $u, New Y: $v" >> ~/window_move.log
Тестирование в окружении:
- Проверьте, выполняется ли скрипт через другой менеджер окон (например,
gnome-keybinding-properties
) для изоляции проблемы.
Использование команды nohup:
- Можно попробовать запустить скрипт через
nohup
для предотвращения отключения ввода/вывода.
3. Заключение:
Проблема, с которой вы столкнулись, вероятно вызвана контекстом окружения при выполнении скрипта через клавиатурные сокращения. Логирование и детальная диагностика помогут выявить расхождения. Надеюсь, данные рекомендации окажутся полезными, и вы сможете добиться желаемого результата.
Если у вас остались вопросы, пожалуйста, не стесняйтесь обращаться за более детальной помощью.