Рейтинг:1

Как я могу переместить окно на определенный монитор (Ubuntu 20.04)?

флаг af

Как переместить окно на определенный монитор с помощью кода? У меня есть два экрана, на одном из которых нужно запустить приложение в полноэкранном режиме, а на другом — воспроизвести видео в полноэкранном режиме.

HuHa avatar
флаг es
Этот `wmctrl`, который кто-то (вы?) добавил в качестве тега, является хорошей отправной точкой, ИМХО. Установите этот пакет (sudo apt install wmctrl) и посмотрите справочную страницу (man wmctrl).
Рейтинг:1
флаг ru

Ты можешь использовать xdotool для достижения желаемого.

Я не думаю, что есть какие-либо настройки для перехода к тому или иному экрану, вам просто нужно установить положение каждого окна (положение x и y) и геометрию (размер). Например, выполните следующую команду в окне терминала

xdotool search --name "ЗДЕСЬ НАЗВАНИЕ ОКНА" getwindowgeometry

А затем перемещайте окно между разными мониторами, и вы увидите, что это просто другое (вверху слева) положение x/y в зависимости от настройки и разрешения вашего монитора.

Таким образом, вы можете экспериментировать и кодировать сценарии, чтобы получить соответствующие идентификаторы окон, а затем установить положение с помощью окнодвижение команда и геометрия с размер окна команда.

codlord avatar
флаг ru
Я только что увидел, что ваш вопрос помечен `wmctrl`. Я не слишком знаком с этим, но, возможно, это та же самая позиция/геометрия. Попробуйте `wmctrl -p -G -l`, чтобы просмотреть окна с геометрией и перемещаться между мониторами, чтобы увидеть, что и как меняется.
Рейтинг:0
флаг af

Я создал этот довольно сложный код, чтобы найти окна, которые я хотел переместить на определенный экран, определяемый шириной монитора в миллиметрах (он также изменит размер до правильного разрешения и установит полноэкранный режим приложения):

#!/usr/bin/env python3
подпроцесс импорта
время импорта


def get(cmd): return subprocess.check_output(cmd).decode('utf-8')


def Adjust_resolution(имя, разрешение): # имя = DP-2, разрешение: 1920x1080
    get(['xrandr', '--output', имя, '--mode', res])


def edit_window (монитор, имя_окна, функция):
    print('переезд', имя_окна, 'в', монитор)
    get(['wmctrl', '-F', '-r', имя_окна, '-e', '100,' +
        монитор ['x'] + ',' + монитор ['y'] + ',600,600'])
    get(['wmctrl', '-F', '-r', имя_окна, '-b', функция])


защита get_monitors():
    screendata = [l.split() для l в get(['xrandr', '--current']
                                         ).replace('primary', '').splitlines() если 'connected' в l]
    мониторы = []

    для i в диапазоне (len (экранные данные)):
        монитор = дикт()
        [размер, x, y] = данные экрана[i][2].split('+')
        монитор = {
            'имя': данные экрана[i][0],
            'ширина': данные экрана[i][-3],
            'высота': данные экрана[i][-1],
            'размер': размер,
            'х': х,
            'у': у
        }
        monitors.append(монитор)

    вернуть мониторы


def find_element_where (элементы, ключ, значение):
    return next((item for item in elements if item[key] == value), None)


защита window_info_to_dict (информация):
    _, _, x, y, ширина, высота, _, *name = info.split()
    return {'x': x, 'y': y, 'width': ширина, 'height': высота, 'name': ' '.join(name)}


защита get_window_info():
    список возврата (карта (window_info_to_dict, get (['wmctrl', '-l', '-G']).splitlines ()))


# Константы:
main_monitor_width = '256 мм'
controller_app = 'имя_приложения'
video_player = 'Медиаплеер VLC'
правильное_разрешение = '1920x1080'

# Переменные:
did_remove_fullscreen = Ложь

пока верно:
    пытаться:
        # Получить мониторы:
        мониторы = get_monitors()
        main_monitor = следующий(
            (монитор для монитора в мониторах, если монитор['ширина'] == main_monitor_width), Нет)
        вторичный_монитор = следующий (
            (монитор для монитора в мониторах, если монитор['ширина'] != main_monitor_width), нет)

        # печать (основной_монитор)
        # печать (вторичный_монитор)

        # Получить окна:
        window_info = get_window_info()

        controller_app_window_info = find_element_where(
            window_info, 'имя', controller_app)
        video_player_window_info = find_element_where(
            window_info, 'имя', video_player)

        # Проверьте, правильный ли размер вторичного монитора:
        если вторичный_монитор и вторичный_монитор['размер'] != правильное_разрешение:
            print('Неверное разрешение',secondary_monitor)
            настроить_разрешение (вторичный_монитор ['имя'], правильное_разрешение)

        # печать (controller_app_window_info)
        # печать (video_player_window_info)

        если основной_монитор:
            if controller_app_window_info['x'] != main_monitor['x'] или controller_app_window_info['y'] != main_monitor['y'] или controller_app_window_info['width'] != '1920' или controller_app_window_info['height'] ! = '1080':
                print('Приложение контроллера расположено неправильно')
                edit_window (main_monitor, controller_app, «добавить, полноэкранный режим»)
        еще:
            print('Нет основного монитора')

        если вторичный_монитор:
            if video_player_window_info['x'] != вторичный_монитор['x'] или video_player_window_info['y'] != вторичный_монитор['y'] или video_player_window_info['ширина'] != '1920' или video_player_window_info['высота'] ! = '1080':
                print('Видеоплеер расположен неправильно')
                edit_window (secondary_monitor, video_player, «добавить, полноэкранный режим»)
                did_remove_fullscreen = Ложь
        еще:
            print('Нет вторичного монитора')
            если main_monitor, а не did_remove_fullscreen:
                edit_window (main_monitor, video_player, «удалить, полноэкранный режим»)
                did_remove_fullscreen = Истина

    кроме Исключения как e:
        print('Произошла ошибка', e)

    время сна(10)

Ответить или комментировать

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