我正在使用双显示器设置运行 Xubuntu 11.10。我正在寻找创建一个击键(也许CTRL+ ALT+SPACE这将允许我将选定的窗口发送到下一个监视器。
在 GNOME 中,有一个名为 的包swapmonitor
能够将窗口发送到另一个监视器。通过击键调用该程序可以达到相同的效果。
在 XFCE/Xubuntu 中这是如何完成的?
答案1
这是不久前发布的,我相信您已经得到了答案,但对于那些还没有得到答案的人来说。
运行这些命令
sudo apt-get install xdotool
sudo apt-get install wmctrl
然后从以下链接下载 bash 脚本(归功于 jc00ke) https://github.com/jc00ke/move-to-next-monitor
就我个人而言,我的根目录中有一个目录,用于存储所有个人脚本。但是,您在哪里下载它实际上取决于您。将其更改为具有权限,以便可以执行。例如,将脚本保存为 move-to-next-monitor.sh,然后执行以下命令
chmod 755 move-to-next-monitor.sh
- 设置管理器 -> 键盘 -> 应用程序快捷方式
- 单击添加
- 单击“打开”并将其定向到您的脚本
- 为其分配键盘快捷键,瞧!
现在,您可以使用键盘快捷键将窗口从一个屏幕切换到另一个屏幕。我不确定它如何在两个以上的屏幕上工作。
答案2
我对上面提到的脚本做了一些更改,最初由 jc00ke 编写。
- 我的设置为三个显示器。
- 它维护窗口是否最大化。
- 它用于根据使用情况
script-name -l
和script-name -r
分别向左或向右移动窗口。 - 如果您有两个显示器,您会使用
script-name -a
. - 我添加了一个修复程序,其中 Chromium 应用程序在最小化时非常小,并且不会在新显示器上再次最大化。
我与 jc00ke 通信。虽然这在 Xfce 上效果很好,但他说他在 Unity 中的脚本存在问题。当然,其他桌面环境(例如 Unity)不需要此脚本,因为此类选项内置于窗口管理器中。
要使用该脚本,请使其可执行chmod +x script-name
并安装以下两个程序,sudo apt install xdotool wmctrl
.
#!/bin/bash
#
# 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".
screen_width=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $7 }')
screen_height=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $8 }')
window_id=$(xdotool getactivewindow)
case $1 in
-l )
display_width=$((screen_width / 3 * 2))
;;
-r )
display_width=$((screen_width / 3))
;;
-a )
display_width=$((screen_width / 2))
;;
esac
# 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 window decorations and panels
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=$((x - x_offset))
y=$((y - y_offset))
# Fix Chromium app view issue of small un-maximized size
width=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $4 }')
if [ "$width" -lt "150" ]; then
display_width=$((display_width + 150))
fi
# Compute new X position
new_x=$((x + display_width))
# Compute new Y position
new_y=$((y + screen_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.
if [ $((new_x + width / 2)) -gt $screen_width ]; then
new_x=$((new_x - screen_width))
fi
height=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $5 }')
if [ $((new_y + height / 2)) -gt $screen_height ]; then
new_y=$((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* ]]; then
wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi
答案3
我还创建了自己的 python 脚本来跨显示器移动窗口。
https://github.com/calandoa/movescreen
用法:
movescreen.py <up|down|left|right>
有趣的功能:
- 处理4个方向
- 处理一些特殊情况,例如窗口在多个监视器上重叠
- 独立恢复全屏,水平最大化和垂直状态
- 使用 python 轻松调试或添加新功能。
答案4
另一种替代方案不依赖于任何“二进制”依赖项(如 xdotool 或 wmctrl):https://github.com/AlexisBRENON/ewmh_m2m
- 您可以安装它
pip
(无需手动复制,使其可执行等) - 它处理具有不同布局的多个屏幕(水平、垂直、混合)
- 在不同尺寸的屏幕之间移动时保持窗口/屏幕比例
- 恢复最大化状态(水平、垂直)
种类。