web-dev-qa-db-ja.com

マルチモニター設定で、誤って配置された新しいウィンドウ-トップバーが非表示になることを防ぐにはどうすればよいですか?

Ubuntu 18.04デスクトップとデフォルトの画像ビューアソフトウェアを使用しています。

特定のサイズ(今日では960x960)の画像を開くと、奇妙で​​本当にイライラするケースがあり、ウィンドウは常にに表示されますsecondary画面の左上にトップバー(ドラッグに使用するもの、名前を覚えていません)がこのように隠れている enter image description here 私は1組の画面を使用しています。左側がプライマリー、右側がセカンダリーです。サイドバーはセカンダリ画面にあります。

奇妙なのは、400x400 enter image description here または1920x1200 enter image description here で結構です。

だから私の質問は、トップバーを失うことなく現在のモニターでそれを開くことは可能ですか?

私たちは問題の原因が何であるかを推測することしかできませんが、私は実際の修正の手がかりはありません。ただし、回避策を使用して、不適切なウィンドウの配置を修正できます。

原則

小さなデーモンのようなプロセスは、 "= negative"配置(xまたはyのいずれか)をモニターに表示し、対応するモニターのx = 80px、y = 80pxの位置に移動します。

enter image description here

これは、新しく作成されたウィンドウのSEコーナーを調べることによって行われます。 SEは、完全に配置されているはずのモニターであると想定されます。次に、ウィンドウのNWコーナーの配置が、トリガー(ウィンドウをより適切な位置に移動)にするか、ウィンドウをそのままにします。これは、モニターSEがオンになっている状態で、左側または上方に配置しないでください。

他のすべての場合では、ウィンドウは完全にそのままになります。ご了承ください:

  • このプロセスは決して負担ではなく、機会が発生するのを待っているだけで、新しいウィンドウが誤って配置された場合にのみ機能します(ポーリングプロセスではありません)。
  • モニターが3台ないので、正確にテストすることはできませんでした。でも、問題はないと思います。
  • プロセスはスケーリングに精通しており、スケーリングの処理における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
Jacob Vlijm

2つのモニターが上部に並んでいないときにウィンドウがトリミングされる問題が報告されています。

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