按脚本排列窗口

按脚本排列窗口

我在不同的配置下使用笔记本电脑。有时我只使用笔记本电脑,带有 LVDS1 输出。有时我在 LVDS 右侧有一个显示器 (DP1)。有时在左侧。有时我有两个显示器 (DP2/DP3) - 一个在左侧,一个在 LVDS 右侧

我想为这个环境设置我的桌面。我希望 xfce 面板始终在 LVDS 上,Web 浏览器始终在外部显示器上(如果有 2 个显示器 - 在右侧),通信器 (pidgin) 在左侧 (DP2) 或 LVDS(如果没有左显示器)。

我已经准备好一组脚本来使用 xrandr 配置 xserver - 适用于所有配置。我通过 xfconf-query 设置面板的位置。

但是 - 如何将特定应用程序移动到特定显示器?例如 - 如何将所有 pidgin 应用程序运行到 DP2?我不想用鼠标来做 - 我想将所有过滤的 xwindow 客户端移动到特定显示器。可能吗?

答案1

如果您的主要目标是避免使用鼠标,此脚本允许使用键盘快捷键在显示器之间移动窗口。它在我的三显示器设置中非常有用。然后,您可以在移动到新显示器后分配键盘快捷键来平铺。

  1. 下载下面的脚本。保存在 ~/bin/ 下
  2. 使其可执行: chmod +x ~/bin/move-to-next-monitor

来源:https://github.com/jc00ke/bin/blob/master/move-to-next-monitor。感谢jc00ke!

#!/bin/sh
#
# Move the current window to the next monitor.
#
# Also works only on one X screen (which is the most common case).
#
# Props to
# http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/
#
# Unfortunately, both "xdotool getwindowgeometry --shell $window_id" and
# checking "-geometry" of "xwininfo -id $window_id" are not sufficient, as
# the first command does not respect panel/decoration offsets and the second
# will sometimes give a "-0-0" geometry. This is why we resort to "xwininfo".
# Make sure your largest monitor is set to Primary display.

screen_width=`xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f1`
screen_height=`xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f2`
display_width=`xdotool getdisplaygeometry | cut -d" " -f1`
display_height=`xdotool getdisplaygeometry | cut -d" " -f2`
window_id=`xdotool getactivewindow`

# Remember if it was maximized.
window_state=`xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }'`

# Un-maximize current window so that we can move it
wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz

# Read window position
x=`xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }'`
y=`xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }'`

# Subtract any offsets caused by panels or window decorations
x_offset=`xwininfo -id $window_id | awk '/Relative upper-left X:/ { print $4 }'`
y_offset=`xwininfo -id $window_id | awk '/Relative upper-left Y:/ { print $4 }'`
x=`expr $x - $x_offset`
y=`expr $y - $y_offset`

# Compute new X position
new_x=`expr $x + $display_width`
# Compute new Y position
new_y=`expr $y + $display_height`

# If we would move off the right-most monitor, we set it to the left one.
# We also respect the window's width here: moving a window off more than half its width won't happen.
width=`xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f1`
if [ `expr $new_x + $width / 2` -gt $screen_width ]; then
  new_x=`expr $new_x - $screen_width`
fi

height=`xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f2`
if [ `expr $new_y + $height / 2` -gt $screen_height ]; then
  new_y=`expr $new_y - $screen_height`
fi

# Don't move off the left side.
if [ $new_x -lt 0 ]; then
  new_x=0
fi

# Don't move off the bottom
if [ $new_y -lt 0 ]; then
  new_y=0
fi

# Move the window
xdotool windowmove $window_id $new_x $new_y

# Maintain if window was maximized or not
if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then
    wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi
  1. 如果尚未安装,请安装 xdotool 和 wmctrl:sudo apt-get install xdotool wmctrl
  2. 接下来,在键盘 > 应用程序快捷键下为脚本分配一个键盘快捷键。(我使用 Alt+Right。然后,向右平铺时使用 Ctrl+Alt+Right,向左平铺时使用 Ctrl+Alt+Left。窗口平铺键盘快捷键位于窗口管理器下。)
    来源:http://makandracards.com/makandra/12447-how-to-move-a-window-to-the-next-monitor-on-xfce-xubuntu

适用于不同尺寸的显示器
我有一个 1920x1080 的中央显示器和两个 1440x900 的侧面显示器。

display_width=`xdotool getdisplaygeometry | cut -d" " -f1`
display_height=`xdotool getdisplaygeometry | cut -d" " -f2`

即使窗口恰好位于侧面显示器上,上述两个命令也会输出我最大显示器的尺寸。因此,脚本始终根据这些尺寸移动窗口。这导致脚本并不总是移动到下一个显示器,但有时会移动到上一个显示器。我将我的总屏幕宽度(4800)除以三。现在它总是移动到下一个显示器。

display_width="1600"
display_height=`xdotool getdisplaygeometry | cut -d" " -f2`

答案2

出于某种原因,我可以添加答案,但无法对上面的 jbrock 的答案发表评论......

在我的设备(Fedora 22)上,xprop -id $window_id _NET_WM_STATE对于非最大化窗口,返回“_NET_WM_STATE_FOCUSED”而不是什么都不返回,所以脚本在移动窗口后总是将其最大化。

另外,窗口可以只在一个方向上最大化,但脚本最后总是将两个方向应用回去。

要将窗口恢复到之前最大化的状态,请明确测试这两个标志并将它们分别添加回去。将原始脚本的最后 3 行替换为以下内容:

if [[ $window_state = *MAXIMIZED_HORZ* ]]; then
  wmctrl -ir $window_id -b add,maximized_horz
fi
if [[ $window_state = *MAXIMIZED_VERT* ]]; then
  wmctrl -ir $window_id -b add,maximized_vert
fi

相关内容