在多个显示器中打开和关闭 Ubuntu 应用程序

在多个显示器中打开和关闭 Ubuntu 应用程序

我在 Ubuntu 18.04 中遇到了一个奇怪的问题。我在 Office 中有一个扩展显示器,我使用 libreoffice 打开了一个 csv 文件并在扩展显示器中查看了它,然后关闭了该显示器。

现在我在家,只有笔记本电脑的显示器可用,当我尝试打开同一个文件(或任何其他 csv 文件)时,文件已打开,但我在屏幕上看不到它。我知道文件已打开,因为在屏幕左侧的垂直栏中,我可以看到 librecalc 图标上有一个红点,当我右键单击该图标并按“所有窗口”时,我可以看到已打开的文件的图标及其 3 行数据。此外,当我执行“ps -ef | grep libre”时,我可以看到该进程仍在运行。

home/xxx$ ps -ef | grep libre
xxx       7948  1227  0 20:57 ?        00:00:00 /usr/lib/libreoffice/program/oosplash --calc file:///home/xxx/Desktop/desktop_files/try/x1.csv
xxx       7966  7948  1 20:57 ?        00:00:04 /usr/lib/libreoffice/program/soffice.bin --calc file:///home/xxx/Desktop/desktop_files/try/x1.csv --splash-pipe=5

第二天,当我回到办公室,扩展显示屏再次可用时,我现在可以打开同一个 csv 文件 - 应用程序在扩展显示屏中打开。但这次我将应用程序拖到笔记本电脑显示屏上并在那里关闭了应用程序。之后,当我再次打开 csv 文件时,这次文件在笔记本电脑显示屏上正确打开了。

那么,我该如何重置应用程序,以便它现在仅在可用的显示中打开?注意:csv 文件非常小,只有大约 300 个字节和 3 行数据,并且可以使用 MS excel 或 WPS 工具正常打开。

我不知道这个问题是否在所有应用程序中都会发生,但我也注意到 Skype 有这个问题。

笔记:Jacob 要求我提供有关 xrandr 的信息,如下所示。在这种情况下,我关闭了扩展窗口中的 libreoffice,然后断开该窗口的连接,并尝试在笔记本电脑窗口中打开 libreoffice。像往常一样,应用程序图标显示它已打开,但窗口不可见。

$ xrandr
Screen 0: minimum 320 x 200, current 2390 x 768, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 309mm x 174mm
   1366x768      59.97*+  39.97  
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
VGA-1-2 connected 1024x768+1366+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x768      60.00* 
   800x600       60.32    56.25  
   848x480       60.00  
   640x480       59.94  
  1024x768 (0x43) 65.000MHz -HSync -VSync
        h: width  1024 start 1048 end 1184 total 1344 skew    0 clock  48.36KHz
        v: height  768 start  771 end  777 total  806           clock  60.00Hz
  800x600 (0x44) 40.000MHz +HSync +VSync
        h: width   800 start  840 end  968 total 1056 skew    0 clock  37.88KHz
        v: height  600 start  601 end  605 total  628           clock  60.32Hz
  800x600 (0x45) 36.000MHz +HSync +VSync
        h: width   800 start  824 end  896 total 1024 skew    0 clock  35.16KHz
        v: height  600 start  601 end  603 total  625           clock  56.25Hz
  640x480 (0x47) 25.175MHz -HSync -VSync
        h: width   640 start  656 end  752 total  800 skew    0 clock  31.47KHz
        v: height  480 start  490 end  492 total  525           clock  59.94Hz
$ 

答案1

后台进程设置新窗口应出现在哪个显示器上。
您可以在有一台显示器时运行此脚本,并在有多台显示器时停止它。它是为不同的目的编写的,但适合您的情况。向@JacobVlijm致以所有问候/点赞脚本
。如果将此脚本放在启动应用程序中,请在执行前添加一些延迟。将监视器名称作为参数传递./script LVDS-1

答案2

我等了一个月,没人回复。然后我在 launchpad 上发布了这个,下面是那里发布的答案(引述如下)。它对我有用。

我建议阅读https://help.ubuntu.com/stable/ubuntu-help/shell-windows.html.en#working-with-windows

根据https://help.ubuntu.com/stable/ubuntu-help/shell-windows-states.html.en您应该能够通过在任务栏中选择它、按 alt+F7、然后按箭头键将窗口移动到主屏幕、然后按“enter”来移动不可见的窗口。如果扩展屏幕位于笔记本电脑屏幕的右侧,那么您可能必须使用“左”键。

答案3

当我从挂起状态恢复时,也会发生类似的情况,三个显示器中的一个(通常是上个月更换的旧显示器#3)处于非活动状态。

我可以在仪表盘上看到应用程序正在运行,但是窗口不可见。

  • 使用Alt+Tab选择不可见的窗口。
  • Alt+F7拖动不可见的窗口。
  • 鼠标指针从屏幕上消失。
  • 移动鼠标(不单击)直到在我想要的窗口位置出现十字鼠标指针。
  • Left-Click瞧!窗口又可见了。

您可以在工作桌面上使用可见的 Windows 进行实验。

答案4

按下按键将所有窗口移动到唯一剩余的屏幕

您所描述的是特定硬件上发生的错误。断开第二个屏幕后,它仍然在输出中显示为xrandr“幻影”显示器。您应该报告它。

如何解决?

虽然这是适当的措施,但从短期来看,它不会有太大的帮助,因为这种类型的错误通常比一两个 Ubuntu 版本存活的时间更长。

您找到了一种解决方法,但似乎相当麻烦。或者,您可以在键盘快捷键下设置下面的脚本。它会将所有“正常”窗口移动到左侧显示器,排列如下图所示,以便选择要使用的窗口:

在此处输入图片描述

剧本

#!/usr/bin/env python3
import gi
gi.require_version("Wnck", "3.0")
from gi.repository import Wnck
import subprocess

scr = Wnck.Screen.get_default()
scr.force_update()
wins = [
    w for w in scr.get_windows() if
    w.get_window_type() == Wnck.WindowType.NORMAL
]

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8".strip())
    except subprocess.CalledProcessError:
        pass

def get_yshift(window):
    """
    windows with property NET_FRAME_EXTENTS are not positioned correctly.
    we can fix that by looking up the top- extent value, add it to the
    targeted y- position.
    """
    wid = window.get_xid()
    xprop_data = get(["xprop", "-id", str(wid)])
    try:
        check = [
            l.split("=")[1].strip().split(", ")
            for l in xprop_data.splitlines()
            if "_NET_FRAME_EXTENTS(CARDINAL)" in l
        ][0]
        y_shift = - int(check[2])
    except IndexError:
        y_shift = 0
    return y_shift

x = 120
y = 70

for w in wins:
    print(w.get_name(), x, y)
    w.unmaximize()
    g = Wnck.WindowGravity.NORTHWEST
    flags = Wnck.WindowMoveResizeMask.X | \
        Wnck.WindowMoveResizeMask.Y | \
        Wnck.WindowMoveResizeMask.WIDTH | \
        Wnck.WindowMoveResizeMask.HEIGHT
    w.set_geometry(g, flags, x, y + get_yshift(w), 200, 300)
    x = x + 90
    y = y + 50

设置

  1. 将脚本复制到一个空文件中,另存为collect_windows.py
  2. 创建快捷方式,运行命令:

    python3 /path/to/collect_windows.py
    

    (进入设置->设备->键盘->自定义快捷键,点击+

就这样

相关内容