GNU/Linux >> Belajar Linux >  >> Ubuntu

Bagaimana Cara Memulihkan Jendela Offscreen Setelah Melepaskan Monitor Kedua?

Saya menggunakan Ubuntu 14.04 di laptop saya di meja saya dengan monitor kedua. Saat saya memutuskan sambungan dari monitor kedua—tanpa gagal—jendela saya untuk Emacs berpindah dari layar.

Saya dapat Alt-TAB untuk menjadikan Emacs jendela aktif, dan, bekerja membabi buta, menghentikan Emacs sehingga saya dapat memulai kembali, yang menyebabkannya muncul kembali di layar. Tapi, menurut saya harus ada cara di Ubuntu untuk mengembalikan jendela di luar layar ke layar. Apakah ada?

Tentu saja, solusi yang lebih baik adalah mencegah jendela keluar dari layar sebagai respons terhadap pemutusan monitor, dan saya akan menerima solusi untuk itu masalah.

PERBARUI:

Keluaran dari xrandr saat terhubung ke monitor kedua:

Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+1280+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024      60.0*+   75.0  
   1280x960       60.0  
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     66.7     60.0  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Keluaran dari xrandr setelah memutuskan sambungan dari monitor kedua:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Juga, saya mencoba menukar posisi kiri-kanan jendela Terminal saya dan jendela Emacs saya dan kemudian memutuskan sambungan. Ini memungkinkan jendela Emacs untuk tetap berada di layar setelah memutuskan sambungan dari monitor kedua. Dan jendela Terminal bertahan di posisi yang menghilangkan Emacs. Jadi, sepertinya aplikasi itu ada hubungannya dengan ini.

Jawaban yang Diterima:

Pindahkan semua jendela ke area yang terlihat

Seperti yang diusulkan/diminta dalam komentar, skrip di bawah ini akan memindahkan semua jendela "normal" ke area yang terlihat di ruang kerja saat ini.

Solusinya adalah solusi; info layar diperbarui dengan benar, mengingat perbedaan dalam output xrandr , sebelum dan dan sesudah memutuskan sambungan. Alasan mengapa jendela tidak bergerak sendiri (saat ini) tidak diketahui, kecuali jawaban lain memecahkan masalah.

Skrip

#!/usr/bin/env python3
import subprocess

# get the resolution of the screen (+0+0)
res = [
    int(n) for n in [
        s.split("+")[0].split("x")\
        for s in subprocess.check_output(["xrandr"]).decode("utf-8").split()\
        if "+0+0" in s][0]
    ]
# create list of windows
w_list = [w.split() for w in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# filter only "normal" ones
valid = [
    w for w in w_list if "_NET_WM_WINDOW_TYPE_NORMAL" in\
    subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8")
    ]
# get the number of valid windows and calculate a targeted position
# the targeted position is a hunch, it will be exact if the window fits completely inside the resolution
# it will work anyway
parts = len(valid)+2
positions = [(int(n*res[0]/parts), int(n*res[1]/parts)) for n in list(range(parts))[1:-1]]
# unmaximaize, move the windows to the visible area (current workspace)
for i, w in enumerate(valid):
    subprocess.Popen(["wmctrl", "-ir", w[0], "-b", "remove,maximized_vert,remove,maximized_horz"])
    # weird, but sometimes wmctrl refuses to move a window if it is not resized first (?)
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", "0,200,200,200,200"])      
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", (",").join(["0", str(positions[i][0]), str(positions[i][1]),w[4],w[5]])])

Cara menggunakan

  1. Script membutuhkan wmctrl :

    sudo apt-get install wmctrl
    
  2. Salin skrip ke file kosong, simpan sebagai move_windows.py

  3. Uji-jalankan:buka sejumlah jendela, letakkan di ruang kerja yang berbeda, dll., atau coba putuskan sambungan monitor kedua. Kemudian jalankan perintah:

    python3 /path/to/move_windows.py
    

    Semua jendela "normal" harus dipindahkan ke area yang terlihat dari ruang kerja saat ini.

  4. Jika semuanya berfungsi dengan baik, tambahkan ke tombol pintasan:pilih:Pengaturan Sistem> “Keyboard”> “Pintasan”> “Pintasan Khusus”. Klik “+” dan tambahkan perintah:

    python3 /path/to/move_windows.py
    

Sekarang Anda seharusnya dapat memindahkan semua jendela ke area yang terlihat di ruang kerja saat ini, dengan tombol pintas Anda.

Terkait:Kvm Network Bridge untuk Menetapkan Ip Statis di Ubuntu?
Ubuntu
  1. Bagaimana Memulihkan Setelah Kate Crashes?

  2. Bagaimana Memulihkan / Membunuh Sesi Ssh Setelah Kehilangan Koneksi?

  3. Dua Layar X, Bagaimana Cara Mendapatkan Window Manager Di Layar Kedua?

  1. Bagaimana Cara Memperbaiki Hibernasi?

  2. Bagaimana memulihkan setelah menghapus tautan simbolik libc.so.6?

  3. Cara memulihkan shell setelah pemutusan

  1. Bagaimana Memulihkan Data Xfs Setelah Rm?

  2. Bagaimana Cara Membuat Daftar Monitor yang Terhubung Dengan Xrandr?

  3. Bagaimana cara menghentikan perubahan alamat MAC setelah memutuskan sambungan?