Установка размеров окна работающего приложения

28

Я пытаюсь запустить приложение в Ubuntu (xfce или gnome) и через командную строку, и мне было интересно, есть ли общий способ установить размеры данного окна данного приложения, которое в данный момент запущено?

Джейми
источник

Ответы:

18

Это легче сделать, если вы установите что-то вроде xdotool. Тогда вы можете сделать:

xdotool search --name "window name" windowsize 300 400

замените «имя окна» именем или регистром, появляющимся в заголовке окна (вы также можете выполнить поиск по классу окна и множеству других вещей), и два числа, появляющиеся после размера окна, - это ширина и высота соответственно. (Вы также можете использовать проценты и т. Д.) Смотрите, как man xdotoolтолько он установлен.

Если вы используете Lucid или более раннюю версию, я рекомендую перейти на веб-сайт xdotool, чтобы получить более новую версию.

Чтобы изменить размер Firefox, например:

xdotool search --name "Mozilla Firefox" windowsize 1024 768
радостный
источник
3
Есть ли способ, как изменить размер полноэкранного окна без украшений (заголовок)? И установить точное положение на экране (например, х = 0, у = 0)? Я пытаюсь установить для развернутого mplayer значение 800x600 x = 0 y = 0, а затем через несколько минут в тот же полноэкранный режим. спасибо
Питер
15

Если оконный менеджер поддерживает Xlib, то он есть. Это использует Python, чтобы установить размер окна 500x300:

WIDTH, HEIGHT = 500, 300
import Xlib
import Xlib.display

display = Xlib.display.Display()
root = display.screen().root
windowID = root.get_full_property(display.intern_atom('_NET_ACTIVE_WINDOW'), Xlib.X.AnyPropertyType).value[0]
window = display.create_resource_object('window', windowID)
window.configure(width = WIDTH, height = HEIGHT)
display.sync()

Сложная часть - получить идентификатор окна; в приведенном выше коде он получил идентификатор активного окна. Если вам нужен другой идентификатор, вы можете использовать что-то вроде этого, чтобы получить заголовок и управляющий PID каждого окна, и выбрать правильный идентификатор на основе этих:

windowIDs = root.get_full_property(display.intern_atom('_NET_CLIENT_LIST'), Xlib.X.AnyPropertyType).value
for windowID in windowIDs:
    window = display.create_resource_object('window', windowID)
    name = window.get_wm_name() # Title
    prop = window.get_full_property(display.intern_atom('_NET_WM_PID'), Xlib.X.AnyPropertyType)
    pid = prop.value[0] # PID
Михаил Мрозек
источник
Xlib доступен здесь: sourceforge.net/projects/python-xlib/?source=typ_redirect
khaverim
когда я print pidполучу <Xlib.protocol.request.GetProperty serial = 15, data = {'bytes_after': 0, 'property_type': 6, 'value': (32, array('I', [5810L])), 'sequence_number': 15}, error = None>... любое предложение изолировать фактический PID?
Хаверим
Nvm. Кажется невозможным, но я могу сделать обходной путь через name.
Хаверим
1
@khaverim Хмм. Я думаю, что этот API изменился с тех пор, как я писал в последний раз, это был просто PID. Я обновил ответ, вы хотите взять значение, возвращаемое get_full_propertyи сделать .value[0]( valueэто массив )
Майкл
1
Python Xlib можно установить с помощью: sudo apt-get install python-xlib (в Ubuntu)
Том
4

Специфично для XFCE есть pyxfce, который позволит вам делать это с использованием языка Python . Pyxfce - это API, который, помимо прочего, позволяет вам общаться с оконным менеджером . Чтобы использовать это из командной строки, вам потребуется сначала подготовить скрипт.

В зависимости от вашего использования, важность использования API на основе X с использованием идентификаторов X-окон (таких как python-xlib или xdotools, упомянутых в другом ответе) по сравнению с другими, которые используют строки, соответствующие заголовкам окон (например, wmctrl), заключается в том, что путаница между окнами, которые могут иметь одинаковые ключевые слова в соответствующем заголовке.

Вениамин
источник
3
#!/bin/bash
#get window pid under mouse
xprop -id $(xwit -current -print | cut -d ":" -f 1) | grep _NET_WM_PID | cut -d "=" -f2 | cut -c 2-
Уилтон Лазарь
источник
0

Я нашел wmctrl подходит мне лучше всего. Он доступен в виде небольшого пакета для Ubuntu и Raspbian, а также для других дистрибутивов.

Карел Адамс
источник
У нас есть ответ, в котором упоминается wmctrl , но у нас нет ответа, показывающего, как его использовать; Не могли бы вы расширить свой ответ демонстрацией, чтобы люди могли взять его и адаптировать для своего конкретного использования? Спасибо!
Джефф Шаллер
Если бы у меня был пример, я бы его добавил. Но разве не для этого нужны man-страницы?
Карел Адамс