Skip to main content

记住您打开的窗口的位置、大小和虚拟桌面,并在以后恢复它们。

项目描述

事后诸葛亮

一个可以在 Ubuntu 上记录窗口位置和大小并在以后恢复这些位置的工具。

问题

问题是,在 Ubuntu 20.04(至少)中,当您有多个显示器时,Gnome 无法处理窗口位置,每个显示器都具有不同的分辨率。锁定系统时尤其明显。如果一个监视器比其他监视器唤醒得更快,系统会认为它已经消失并继续将所有窗口放在一个监视器上或随机混乱。例如,您可以将一台显示器设置为 1920 x 1080,另一台设置为 3840 x 2160 (4k)。我发现当您在多个虚拟桌面上打开数十个窗口时,这可能会很烦人!

这个想法是在您登录时启动一个脚本(monitor_lock.sh),该脚本将监视(使用 dbus-monitor)系统的锁定事件。当检测到锁定事件时,脚本调用hindsight并记录窗口的位置和大小。当脚本检测到解锁事件时,它会调用hindsight并恢复窗口大小和位置。

注意:如果您不想自动运行脚本,您可以在锁定事件之前手动调用它,然后手动恢复。您可以将呼叫分配给快捷键对。

注意:这不是 100% 准确的。对于大多数窗口,它应该可以正常工作,但您可能需要调整一些窗口才能更好地工作。您很可能需要为您的系统配置一些东西。如果您有两个以上的监视器,则需要对restore.py脚本进行一些编辑。

注意:有时脚本可能无法恢复到正确的虚拟桌面(显示器加载速度比平时慢,或者我输入密码太快)。您必须手动调用对hindsight restore.

版本和要求

  • Ubuntu v20.04
  • Python v3.9
  • wmctrl -sudo apt install wmctrl

您将需要安装 Python(最新版本可能可以正常工作,但您至少需要 v3.9)。您还需要一个名为wmctrl的工具。

安装

安装wmctrl

$ sudo apt install wmctrl

您可以简单地从pypi安装软件包:

$ pip install hindsight-ubuntu

或者你可以从 git repo安装它:

$ mkdir -p ~/repositories/hindsight

$ cd ~/repositories/hindsight

$ git clone https://github.com/TroyWilliams3687/hindsight.git

创建虚拟环境:

$ make

激活虚拟环境:

$ . .venv/bin/activate

配置文件

配置文件位于示例文件夹中。它可以放在~/.config/bluebill.net/hindsight/settings.yaml. 这将用于微调窗口位置。它的结构如下:

# Hindsight
# ---------
#
# https://github.com/TroyWilliams3687/hindsight

# The configuration file allows you to customize Hindsight for your system. It
# allows you to set the scale and specific positions for specific windows that
# don't seem to follow the rules.

# Location - ~/.config/bluebill.net/hindsight/settings.yaml

# ---------
# Scale

# Adjust the scale ratio if you have monitors at different resolution. Find the
# min and max values for the width and height and divide them to get a proper
# aspect ratio. For example, I have two monitors with the following resolutions:

#         w  x h
# m1 = [1920, 1080]
# m2 = [3840, 2160]

# scale_x = m1[0] / m2[0] = 0.5
# scale_y = m1[1] / m2[1] = 0.5

scale_x: 0.5 # Default 1.0
scale_y: 0.5 # Default 1.0

# ---------
# Window Fine Tuning

# Some windows will simply not play nice with the system. You can specify part
# of the text that is in the window title (that is how the system knows which
# window to use). You also can specify the x and y position of the upper left
# corner of the window. If one coordinate does not require an adjustment, set it
# to 0.

# NOTE: Default is empty

# NOTE: The text is case-sensitive

window_adjustments:
  - title_text: "Firefox"
    x: -7
    y: -8
  - title_text: "Discord"
    x: -10
    y: 0

用法

直接记录和保存窗口位置和大小(确保虚拟环境处于活动状态):

$ hindsight save

要恢复窗口大小和位置:

$ hindsight restore

注意:它仅适用于系统中处于活动状态的窗口。如果调用 restore 时窗口不存在,它将被忽略。

注意:这是一个基于会话的系统。如果你打开一个窗口,记录它的位置然后关闭它。如果你再次打开它,保存的位置将不会应用到它,因为它将有一个新的基于会话的 id。

存储位置

窗口设置存储在 JSON 文件中:

~/.config/bluebill.net/hindsight/locations.json

您可以随时删除该文件,它将自动重新创建。每次保存设置时都会自动覆盖它。

启动脚本

您可以使用启动脚本monitor_lock.sh来启动 dbus 监视器以监视锁定/解锁事件并自动应用脚本。如果启动脚本不能正常工作,您可以随时绑定到快捷键并以这种方式保存配置。

定制

monitor_lock.sh

您很可能需要修改存储库的路径,以便它可以保存/恢复窗口位置。您需要更改以下行的路径:

EXE=~/repositories/projects/hindsight/.venv/bin/hindsight

注意:您将脚本添加到启动应用程序,以便在您首次登录系统时启动它并继续运行直到您注销。

事后恢复

恢复脚本旨在处理两个具有特定分辨率的显示器。你的旅费可能会改变。您很可能需要修改恢复脚本restore.py中的部分。您感兴趣的行是从 66 到 114。

注意:我想不出用 wmctrl 工具更好的方法。如果您运行wmtrcl -lG并观察 x,y,w,h 它报告并在窗口中使用那些完全相同的值wmctrl -ir xxxxxx, -e 0,x,y,w,h会移动很多(至少它在我的系统上是这样)。它的移动比窗户装饰所显示的要多得多。有些窗户比其他窗户移动得更多,似乎没有规律。将来如果我能把它整理好,我会发布修改。

.bashrc别名

我发现设置 bash 别名来启动保存/恢复很有用。在某些情况下,我发现显示器唤醒速度不够快,并且窗口位置不正确。在这些情况下,简单地执行hsr就可以了。

alias hsr="~/repositories/projects/hindsight/.venv/bin/hindsight restore"
alias hss="~/repositories/projects/hindsight/.venv/bin/hindsight save"

注意:根据您创建虚拟环境的位置设置别名所指的路径。

执照

麻省理工学院

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

后见之明-ubuntu-0.0.3.tar.gz (13.3 kB 查看哈希

已上传 source

内置分布

后见之明_ubuntu-0.0.3-py3-none-any.whl (12.8 kB 查看哈希

已上传 py3