Как я могу предотвратить положенные не на место новые окна - главная панель скрывается - в установке мультимонитора?

Я использую рабочий стол Ubuntu 18.04 и программное обеспечение Image Viewer по умолчанию.

Существует странный и действительно расстраивающий случай, когда я открою изображение (изображения) с определенным размером (960x960 на сегодняшний день), окно будет всегда появляться в верхнем левом из моего вторичного экрана с главной панелью (тот, который мы используем для перетаскивания его вокруг, я не помню имя), скрывающийся как этоenter image description here, я использую пару экранов, большое, столь же основное слева и маленькое как вторичный справа. Боковая панель находится на вторичном экране.

Что делает, это странный являются другие размеры как 400x400enter image description here, или 1920x1200enter image description here прекрасны.

Таким образом, мой вопрос, действительно ли возможно заставить его открыться в текущем мониторе без главных пропавших без вести панели?

5
задан 14 November 2019 в 01:28

2 ответа

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

принцип

крошечный подобный демону процесс будет ожидать создания любого окна, на любом из Ваших мониторов, с "отрицательное" размещение (или x или y) на мониторе, и перемещать его в положение x=80px, y=80px на соответствующем мониторе:

enter image description here

Это делает так путем рассмотрения угла SE недавно созданных окон. SE, как предполагается, является монитором, в который он должен был быть полностью помещен. Размещение угла NW окна является затем триггером к любому действию (переместите окно в лучшее положение), или оставьте окно в покое: это не должно быть или в левых или выше монитора, SE идет.

Во всех других случаях, окно оставлено в покое полностью. Обратите внимание что:

  • этот процесс не является нагрузкой всегда, он просто ожидает случая для случая, только действия, если новое окно положено не на место (не процесс опроса).
  • я не мог протестировать его в точно Вашей установке, так как у меня нет трех мониторов. Я не ожидаю проблем с ним все же.
  • процесс масштабирует здравый смысл, количества с "переводом" между Wnck и Gdk в обработке масштабирования.

код

#!/usr/bin/env python3

import gi
gi.require_version("Gtk", "3.0")
gi.require_version("Wnck", "3.0")
from gi.repository import Gtk, Wnck, Gdk

class WatchOut:
    def __init__(self):
        self.wnckscr = Wnck.Screen.get_default()
        self.gdkdsp = Gdk.Display.get_default()
        self.wnckscr.connect("window_opened", self.checkonwin)
        Gtk.main()

    def actoncreate(self, window):
        wingeo = window.get_geometry();
        # get window geo, take SE as reference, abs numbers
        nw_x = wingeo.xp
        nw_y = wingeo.yp
        se_x = nw_x + wingeo.widthp
        se_y = nw_y + wingeo.heightp
        # get scale
        defmon = self.gdkdsp.get_primary_monitor()
        scale = defmon.get_scale_factor()
        # get monitor with window, gdk uses scaled(!)
        currmon = self.gdkdsp.get_monitor_at_point(se_x/scale, se_y/scale)
        # gdk uses scaled numbers!
        mongeo = currmon.get_geometry() 
        mondata = [n * scale for n in [
            mongeo.x, mongeo.y, mongeo.width, mongeo.height
        ]]
        # check if action is needed, calc in abs numbers!
        # if winx < monitorx -and/or- winy < monitory, move window
        if any([nw_x < mondata[0], nw_y < mondata[1]]):
            self.move(
                window, mondata[0] + 80, mondata[1] + 80, 700, 700
            )

    def move(self, win, x, y, w, h):
        g = Wnck.WindowGravity.NORTHWEST
        flags = Wnck.WindowMoveResizeMask.X | \
            Wnck.WindowMoveResizeMask.Y | \
            Wnck.WindowMoveResizeMask.WIDTH | \
            Wnck.WindowMoveResizeMask.HEIGHT
        win.set_geometry(g, flags, x, y, w, h)

    def checkonwin(self, scr, newwin):
        if newwin.get_window_type () == Wnck.WindowType.NORMAL:
            self.actoncreate(newwin)

WatchOut()

, Как использовать

  1. Копия код выше в пустой файл, сохраните его как watchout.py
  2. Тестовый прогон он от терминала командой:

    python3 /path/to/watchout.py
    

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

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

0
ответ дан 23 November 2019 в 10:40

Были проблемы, сообщенные, где окна обрезаются, когда два монитора приводят в порядок не строку наверху:

screen display.png

Для подтверждения они выстраиваются в линию отлично вдоль главного использования xrandr:

$ xrandr | grep " connected" | grep "+0"

HDMI-0 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 1107mm x 623mm
DP-1-1 connected 3840x2160+1920+0 (normal left inverted right x axis y axis) 1600mm x 900mm

Эти +0 подтверждает, что оба монитора выровненные к вершине.

1
ответ дан 23 November 2019 в 10:40

Другие вопросы по тегам:

Похожие вопросы: