Harici bir monitör bağlandığında pencerelerinizin hareket etmesini önlemenin bir yolu var mı?


9

Bu yüzden, dizüstü bilgisayarımda Ubuntu 14.10 kullanıyorum ve bazen ikinci bir ekran için TV'ye takıyorum. Televizyonum masamın solunda. Dizüstü bilgisayar ekranımın solunda harici bir monitör olarak etkinleştirdiğimde dizüstü bilgisayar ekranımdaki tüm pencereler TV ekranına taşınır. Onları geri taşıyabilirim, ancak her seferinde bunu yapmak çok can sıkıcı, özellikle de birkaç pencere açıkken.

Solda TV

Ancak, TV ekranımı dizüstü bilgisayar ekranımın sağına (neredeyse) ayarlarsam pencereler hareket etmez. Ancak bu, fiziksel kurulumun tersi olduğu için kullanımı anlaşılır bir şekilde kafa karıştırıcıdır. Ayrıca, masamı taşımak istemiyorum.

Sağda TV

Ubuntu veya ekran sunucusu, en soldaki monitörün ana monitör olduğunu ve tüm pencerelerin nerede olması gerektiğini varsayar. Bu davranışı devre dışı bırakmanın bir yolu var mı?

Bu forumları kontrol ediyorum, ancak bu konuda kimse yayınlanmadığını gerçekten görmedim. Aynı konu olmasa da bulduğum en yakın iş parçacığı bu oldu.

Birden fazla monitörden birini kapatırken Ubuntu'nun pencereleri hareket ettirmemesini sağlayın

Herhangi bir fikri olan var mı? Lütfen yaparsan bana haber ver. Teşekkürler!

Yanıtlar:


2

Görünüşe göre tasarlanmış davranışın davranışını değiştirmek için "gizli" bir ayar bulamadım. Gerçekten sol ekranın "temel" ekran olduğu varsayılıyor.

Bununla birlikte, esasen aynı sonuç ile bir geçici çözüm oluşturmak çok mümkündür. İkinci bir ekran bağlandığında, tüm pencereleri listeleyen bir komut dosyası oluşturabilirsiniz. Daha sonra, başlangıçta sol ekrana taşınan tüm pencereler, bir veya iki saniye içinde sağdaki ekrana geri kaydırılır. Tüm pencerelerin boyutu korunacaktır.
Aşağıdaki senaryo bunu yapar.

İki versiyon

Düzenlenmiş pencerelerinizi iki şekilde geri yükleyebilirsiniz:

  • Bazen, ikinci ekran bağlandıktan sonra çalıştırmak için bir kısayol tuşu ile.
  • Otomatik olarak, komut dosyasını arka planda çalıştırmak, ekranınızın bağlanmasını beklemek.

Nasıl kullanılır

Hazırlıklar

  • Yüklemek wmctrl

    sudo uygun-get install wmctrl

  • Yardımı ile iki ekranınızın isimlerine bakın xrandr, ekranların isimleri "bağlı" kelimesinden hemen önce olacaktır.

  • Kopyala Aşağıdaki komut dosyalarından birini, baş bölümünde, bu iki satırda ekran adlarını doğru olanlarla değiştirin:

    screen_1 = "LVDS1"     # your main screen (laptop)
    screen_2 = "VGA1"      # secundary screen (on the left)
    

    komut dosyasını farklı kaydet move_windows.py

  • Ekran ayarlarında ikincil ekranınızın solda olduğundan emin olun. İki ekranın üst satırları aynı hizada olmalıdır (sorunuzun ilk resminde olduğu gibi).

Komut dosyasını
çalıştırın - Ara sıra çalıştırmak için birini kullanın, ikinci ekran bağlandıktan sonra çalıştırın.

    python3 /path/to/move_windows.py

Yapması gerekeni yaptığını düşünüyorsanız, klavye kısayoluna eklemek isteyebilirsiniz: Seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve şu komutu ekleyin:

  • Arka planda çalıştırmak için birini kullanıyorsanız, komutla da çalıştırın:

    python3 /path/to/move_windows.py
    

    İstediğiniz gibi davranıyorsa, başlangıç ​​uygulamalarınıza ekleyin: Çizgi> Başlangıç ​​Uygulamaları> Ekle

Senaryoyu dizüstü bilgisayarım (sağda) ve iki farklı ekranla (solda) test ettim. Sonuç aynıydı.

dizüstü bilgisayar ekranı

resim açıklamasını buraya girin

komut dosyası olmadan bağlanma

resim açıklamasını buraya girin

çalışan komut dosyasına bağlanma

resim açıklamasını buraya girin

Senaryo işini yaptıktan sonra, pencereler "yalnız bırakılacaktır" (elbette) ve pencerelerinizi istediğiniz gibi düzenleyebilirsiniz.

Senaryo (lar)

1. "Manuel" sürüm, ekran bağlandıktan sonra çalıştırmak için

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

shift_windows(get_shift(get("xrandr")))

2. Otomatik sürüm, arka planda çalıştırmak

#!/usr/bin/env python3
import subprocess
import time

#--
screen_2 = "LVDS1"       # replace with your internal screen (right)
screen_2 = "VGA1"        # replace with your external screen (left)
#--

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shift(xr_output):
    lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows(shift):
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    relevant = []
    for w in w_data:
        props = get("xprop -id "+w[0])
        if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])

while True:
    try:
        screen_info1 = get("xrandr")
        time.sleep(5)
        screen_info2 = get("xrandr")
        check = screen_2+" connected"
        if (check in screen_info1, check in screen_info2) == (False, True):
            time.sleep(5)
            shift_windows(get_shift(screen_info2))
    except:
        pass

Ciddi hastalıklar, Jacob!
don.joey

@ K0j0 Başardınız mı?
Jacob Vlijm

@JacobVlijm Her 5 saniyede bir yoklamanın en iyi çözüm olup olmadığından emin değilim (olaya dayalı bir olasılık yok mu?). Her neyse, bu komut dosyasını Birlik göstergesine dönüştürmekle ilgileniyorsanız ( buradaki gibi ) lütfen bizimle iletişime geçin.
Peterino

@Peterino Olay güdümlü bir sinyal varsa, bu benim ilk tercihim olacaktır. Aynı zamanda: Eğer bir arka plan komut dosyası iyi yazılmış olup, bunun ek yük (ve can) pratik olarak yok olmalı ve her zaman bu konuda özel olarak benim komut test. Değişen sayıda arka plan komut dosyası çalıştırıyorum. Hep birlikte bile gözle görülür bir etkisi yoktur. Sisteminizde tanım gereği çok sayıda döngünün çalıştığını unutmayın. Birlik göstergesi önerisi hakkında: Bu ya da başka bir durum için nasıl bir gösterge oluşturulacağını öğrenmekle kesinlikle ilgileniyorum :).
Jacob Vlijm

@JacobVlijm Canonical'daki bir kaynağa göre, pencerelerin otomatik yerleştirilmesinin Ubuntu'nun bir sonraki sürümlerinden ("devam ediyor") otomatik olarak başlayacağı anlaşılıyor . Muhtemelen son birkaç ay içinde mevcut sürümde yatırım yapmaya değmez. Yine de IRC # ubuntu-mir @ freenode üzerinde Mir geliştiricileri ile iki kez kontrol edeceğim.
Peterino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.