Created
July 17, 2020 23:01
-
-
Save StanleySathler/193fda730ac059104ad232f76a1a441f to your computer and use it in GitHub Desktop.
Move active window to the next monitor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# | |
# Source: https://makandracards.com/makandra/12447-how-to-move-a-window-to-the-next-monitor-on-xfce-mate-and-other-x-window-managers | |
# | |
# Move the current window to the next monitor. | |
# | |
# Only works on a horizontal monitor setup. | |
# 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 '/dimensions:/ { print $2; exit }' | cut -d"x" -f1` | |
display_width=`xdotool getdisplaygeometry | cut -d" " -f1` | |
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` | |
# 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 | |
# Don't move off the left side. | |
if [ $new_x -lt 0 ]; then | |
new_x=0 | |
fi | |
# Move the window | |
xdotool windowmove $window_id $new_x $y | |
# Maximize window again, if it was before | |
if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then | |
wmctrl -ir $window_id -b add,maximized_vert,maximized_horz | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment