В Windows (по крайней мере, начиная с XP, вероятно, прежде) при использовании клавиатуры, чтобы переместить или изменить размер Окна, можно получить очень точные местоположения и размеры – еще больше, чем с мышью – при помощи клавиши Ctrl в сочетании с клавишами со стрелками (после того, как вызвал Move
или Resize
функциональность из меню окна [Alt+Space]) для перемещения границ окна пиксель за один раз.
Существует ли способ сделать то же (или подобное) вещь в Ubuntu?
Принятие Вас использует Единицу, сценарий ниже перемещает или изменяет размер окон на 1 пкс. Скрипт может быть запущен с 8 различными аргументами. В зависимости от move/re-size опций Вы хотите использовать, можно добавить команды к комбинации сочетания клавиш. Обзор опций и соответствующих команд ниже:
Существует несколько ограничений:
gnome-terminal
окна могут только быть изменены на шагах. В результате увеличение/уменьшение размера окна на 1 пкс не работает с gnome-terminal
.Сначала установите wmctrl, который необходим, чтобы получить геометрию окна и переместить окно.
sudo apt-get install wmctrl
Создайте каталог ~/bin
(таким образом в Вашем корневом каталоге)
move_window
(никакое расширение)Сделайте это исполняемым файлом (щелкните правой кнопкой по файлу> Свойства> Полномочия (вкладка), галочка "позволяет, выполняются"),
Для тестирования откройте окно терминала и работайте впоследствии:
move_window l
move_window r
move_window u
move_window d
Так как окно терминала является передней стороной больше всего, оно должно переместить 1 пкс в левое/правильное//вниз.
(Как упомянуто, изменение размеров не работает с gnome-terminal
)
Если это работает правильно, добавьте команды к сочетаниям клавиш;
выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команды к четырем различным комбинациям сочетания клавиш. Это могло бы быть хитро, так как команды, которые Вы упомянули, вероятно, заняты. Что работало над моей системой:
для действий перемещения.
Для изменить размер действий необходимо будет попробовать дополнительные комбинации.
#!/usr/bin/env python3
import subprocess
import sys
# calibration
cal = 4
# direction, as argument from user input (l, r, u, d / h+, h-, v+, v-)
direction = sys.argv[1]
# move step size
mv = -1 if direction in ["l", "d", "h-", "v-"] else 1
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command])\
.decode("utf-8")
def execute(command):
subprocess.call(["/bin/bash", "-c", command])
# find the top shift (height of the panel = resolution - working area)
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))[-1]
topshift = int(res) - int(get("wmctrl -d").split()[8].split("x")[-1])+cal
# find frontmost window
def get_windowid():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# get window geometry, create move command
set_w = [w.split()[0:6] for w in get("wmctrl -lG").splitlines()\
if get_windowid() in w][0]
set_w[0] = "wmctrl -ir "+set_w[0]+" -e 0"
set_w.pop(1)
if direction in ["l", "r"]:
set_w[1] = str(int(set_w[1])+mv); set_w[2] = str(int(set_w[2])-topshift)
elif direction in ["u", "d"]:
set_w[2] = str(int(set_w[2])-topshift-mv)
elif direction in ["v-", "v+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[4] = str(int(set_w[4])+mv)
elif direction in ["h-", "h+"]:
set_w[2] = str(int(set_w[2])-topshift); set_w[3] = str(int(set_w[3])+mv)
execute((",").join(set_w))
Существует немного различия в пути wmctrl
сообщают геометрия окна и путь wmctrl
устанавливает геометрию окна. В первом случае это вычисляет с полного экрана (разрешение) во втором случае только от рабочей области (??). Даже затем сценарий должен был "калибровать" 4 пкс вертикально, которых я не нашел удовлетворяющего объяснения. Хорошие новости - то, что на различных компьютерах, я не видел различия в отклонении.
Если в Вашем случае окно делает неожиданные переходы, оставьте комментарий.
Как это работает
Переднее больше всего окно ищется с помощью xprop
:
xprop -root
Где-нибудь в (обширном) выводе, существует строка как:
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x4600a8d
от которого может быть проанализирован наш идентификатор окна: 0x4600a8d
. Так как формат несколько отличается от wmctrl
, мы должны добавить нуль на третьем положении: 0x04200085
Идентификатор окна используется для поиска окна и его текущих данных геометрии в выводе wmctrl -lG
. После того как у нас есть корректная строка, данные, которые мы имеем на окне, похожи:
0x04200085 0 322 52 823 998 <computer_name> <window_name>
где столбец 2, 3, 4, 5 впоследствии:
путем управления этими числами мы можем переместиться/изменить размер окно с командой:
(пример для перемещения окна направо на 1 пкс, изменяясь "322" в "323")
wmctrl -ir 0x04200085 -e 0,323,52,823,998
Существует несколько сложностей для контакта с, но это в основном, как это работает.
По-видимому, это не работает в XFCE также. У меня есть косвенная идея, которая могла бы работать хотя...
я предложил бы пробовать опции Accessibility за управление мышью с клавиатурой , установив его для перемещения очень медленно, и использование что заставить окно перемещаться немного за один раз.
Каждый рабочий стол, кажется, помещает опции Accessibility, где-нибудь отличающиеся в XFCE, это находится под контролем общего менеджера по Настройкам, но не должно быть трудно найти в Единице & другие...