Skip to content

Instantly share code, notes, and snippets.

@avilella
Created January 11, 2015 11:06
Show Gist options
  • Save avilella/fdbd3def8a9648037406 to your computer and use it in GitHub Desktop.
Save avilella/fdbd3def8a9648037406 to your computer and use it in GitHub Desktop.
Aero snap using xdotool
#!/usr/bin/env python3
# From Jacob Vlijm on askubuntu.com
# http://askubuntu.com/a/572052/17702
import subprocess
import sys
move = sys.argv[1]
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def execute(cmd):
subprocess.call(["/bin/bash", "-c", cmd])
# screen resolutions ("raw")
wds = [s for s in get("xrandr").split() if s.endswith("+0")]
# x-res left/right)
left = [scr.split("x")[0] for scr in wds if scr.endswith("+0+0")]
right = [scr.split("x")[0] for scr in wds if not scr.endswith("+0+0")]
# x-positions areas
left_pos = [0, int(int(left[0])/2), int(left[0])]
right_pos = [int(int(left[0])+int(right[0])/2)] if len(right) != 0 else []
x_positions = left_pos+right_pos
# frontmost window pos
frontmost = get("xdotool getwindowfocus getwindowname").strip()
f_data = [l.split() for l in get("wmctrl -lG").splitlines() if frontmost in l][0][:6]
curr_pos = int(f_data[2])
area = len([x for x in x_positions if x <= curr_pos])
if move == "left":
i = area-2; target_pos = x_positions[i] if i >= 0 else 0
elif move == "right":
i = area; target_pos = x_positions[area] if area < len(x_positions) else x_positions[-1]
if i >= 2:
perc = int((100*(x_positions[-1]-x_positions[-2])/sum([int(it) for it in left+right])))
else:
perc = int((100*(x_positions[1]-x_positions[0])/sum([int(it) for it in left+right])))
# execute actions
cmd1 = "wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz"
cmd2 = "wmctrl -ir "+f_data[0]+" -e 0,"+str(target_pos)+","+"30,300,300"
cmd3 = "xdotool windowsize $(xdotool getactivewindow) "+str(perc)+"% 100%"
for cmd in [cmd1, cmd2, cmd3]:
execute(cmd)
@avilella
Copy link
Author

xprop -root

_NET_ACTIVE_WINDOW(WINDOW): window id # 0x380003d
_GNOME_BACKGROUND_REPRESENTATIVE_COLORS(STRING) = "rgb(150,149,149)"
_XROOTPMAP_ID(PIXMAP): pixmap id # 0x3200001
ESETROOT_PMAP_ID(PIXMAP): pixmap id # 0x3200001
_NET_DESKTOP_LAYOUT(CARDINAL) = 0, 0, 1, 0
_ICC_PROFILE_IN_X_VERSION(CARDINAL) = 3
_ICC_PROFILE(CARDINAL) = 0, 0, 6, 224, 108, 99, 109, 115, 4, 48, 0, 0, 109, 110, 116, 114, 82, 71, 66, 32, 88, 89, 90, 32, 7, 222, 0, 12, 0, 25, 0, 13, 0, 47, 0, 19, 97, 99, 115, 112, 65, 80, 80, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 108, 99, 109, 115, 203, 59, 210, 60, 124, 155, 158, 245, 250, 86, 151, 231, 197, 253, 233, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 100, 101, 115, 99, 0, 0, 1, 44, 0, 0, 0, 74, 99, 112, 114, 116, 0, 0, 1, 120, 0, 0, 0, 136, 119, 116, 112, 116, 0, 0, 2, 0, 0, 0, 0, 20, 99, 104, 97, 100, 0, 0, 2, 20, 0, 0, 0, 44, 114, 88, 89, 90, 0, 0, 2, 64, 0, 0, 0, 20, 98, 88, 89, 90, 0, 0, 2, 84, 0, 0, 0, 20, 103, 88, 89, 90, 0, 0, 2, 104, 0, 0, 0, 20, 114, 84, 82, 67, 0, 0, 2, 124, 0, 0, 0, 16, 103, 84, 82, 67, 0, 0, 2, 124, 0, 0, 0, 16, 98, 84, 82, 67, 0, 0, 2, 124, 0, 0, 0, 16, 99, 104, 114, 109, 0, 0, 2, 140, 0, 0, 0, 36, 100, 109, 100, 100, 0, 0, 2, 176, 0, 0, 0, 74, 100, 109, 110, 100, 0, 0, 2, 252, 0, 0, 0, 54, 109, 101, 116, 97, 0, 0, 3, 52, 0, 0, 3, 170, 109, 108, 117, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 101, 110, 85, 83, 0, 0, 0, 46, 0, 0, 0, 28, 0, 72, 0, 80, 0, 32, 0, 69, 0, 78, 0, 86, 0, 89, 0, 32, 0, 49, 0, 53, 0, 32, 0, 78, 0, 111, 0, 116, 0, 101, 0, 98, 0, 111, 0, 111, 0, 107, 0, 32, 0, 80, 0, 67, 0, 0, 0, 0, 109, 108, 117, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 101, 110, 85, 83, 0, 0, 0, 108, 0, 0, 0, 28, 0, 84, 0, 104, 0, 105, 0, 115, 0, 32, 0, 112, 0, 114, 0, 111, 0, 102, 0, 105, 0, 108, 0, 101, 0, 32, 0, 105, 0, 115, 0, 32, 0, 102, 0, 114, 0, 101, 0, 101, 0, 32, 0, 111, 0, 102, 0, 32, 0, 107, 0, 110, 0, 111, 0, 119, 0, 110, 0, 32, 0, 99, 0, 111, 0, 112, 0, 121, 0, 114, 0, 105, 0, 103, 0, 104, 0, 116, 0, 32, 0, 114, 0, 101, 0, 115, 0, 116, 0, 114, 0, 105, 0, 99, 0, 116, 0, 105, 0, 111, 0, 110, 0, 115, 0, 46, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 115, 102, 51, 50, 0, 0, 0, 0, 0, 1, 11, 183, 0, 0, 5, 150, 255, 255, 243, 86, 0, 0, 7, 41, 0, 0, 253, 215, 255, 255, 251, 182, 255, 255, 253, 165, 0, 0, 3, 218, 0, 0, 192, 246, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 114, 76, 0, 0, 63, 35, 0, 0, 4, 41, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 43, 241, 0, 0, 38, 36, 0, 0, 192, 47, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 88, 152, 0, 0, 154, 185, 0, 0, 14, 213, 112, 97, 114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 51, 51, 99, 104, 114, 109, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 158, 192, 0, 0, 89, 0, 0, 0, 83, 0, 0, 0, 155, 64, 0, 0, 39, 0, 0, 0, 30, 64, 109, 108, 117, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 101, 110, 85, 83, 0, 0, 0, 46, 0, 0, 0, 28, 0, 72, 0, 80, 0, 32, 0, 69, 0, 78, 0, 86, 0, 89, 0, 32, 0, 49, 0, 53, 0, 32, 0, 78, 0, 111, 0, 116, 0, 101, 0, 98, 0, 111, 0, 111, 0, 107, 0, 32, 0, 80, 0, 67, 0, 0, 0, 0, 109, 108, 117, 99, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 12, 101, 110, 85, 83, 0, 0, 0, 26, 0, 0, 0, 28, 0, 65, 0, 85, 0, 32, 0, 79, 0, 112, 0, 116, 0, 114, 0, 111, 0, 110, 0, 105, 0, 99, 0, 115, 0, 0, 0, 0, 100, 105, 99, 116, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 1, 0, 0, 0, 0, 22, 0, 0, 1, 22, 0, 0, 0, 42, 0, 0, 1, 64, 0, 0, 0, 20, 0, 0, 1, 84, 0, 0, 0, 42, 0, 0, 1, 126, 0, 0, 0, 22, 0, 0, 1, 148, 0, 0, 0, 6, 0, 0, 1, 154, 0, 0, 0, 34, 0, 0, 1, 188, 0, 0, 0, 38, 0, 0, 1, 226, 0, 0, 0, 22, 0, 0, 1, 248, 0, 0, 0, 8, 0, 0, 2, 0, 0, 0, 0, 16, 0, 0, 2, 16, 0, 0, 0, 64, 0, 0, 2, 80, 0, 0, 0, 18, 0, 0, 2, 98, 0, 0, 0, 6, 0, 0, 2, 104, 0, 0, 0, 34, 0, 0, 2, 138, 0, 0, 0, 24, 0, 0, 2, 162, 0, 0, 0, 20, 0, 0, 2, 182, 0, 0, 0, 16, 0, 0, 2, 198, 0, 0, 0, 20, 0, 0, 2, 218, 0, 0, 0, 16, 0, 0, 2, 234, 0, 0, 0, 20, 0, 0, 2, 254, 0, 0, 0, 16, 0, 0, 3, 14, 0, 0, 0, 24, 0, 0, 3, 38, 0, 0, 0, 16, 0, 0, 3, 54, 0, 0, 0, 24, 0, 0, 3, 78, 0, 0, 0, 16, 0, 0, 3, 94, 0, 0, 0, 22, 0, 0, 3, 116, 0, 0, 0, 16, 0, 0, 3, 132, 0, 0, 0, 22, 0, 0, 3, 154, 0, 0, 0, 16, 0, 67, 0, 77, 0, 70, 0, 95, 0, 112, 0, 114, 0, 111, 0, 100, 0, 117, 0, 99, 0, 116, 0, 117, 0, 110, 0, 105, 0, 116, 0, 121, 0, 45, 0, 115, 0, 101, 0, 116, 0, 116, 0, 105, 0, 110, 0, 103, 0, 115, 0, 45, 0, 100, 0, 97, 0, 101, 0, 109, 0, 111, 0, 110, 0, 67, 0, 77, 0, 70, 0, 95, 0, 98, 0, 105, 0, 110, 0, 97, 0, 114, 0, 121, 0, 117, 0, 110, 0, 105, 0, 116, 0, 121, 0, 45, 0, 115, 0, 101, 0, 116, 0, 116, 0, 105, 0, 110, 0, 103, 0, 115, 0, 45, 0, 100, 0, 97, 0, 101, 0, 109, 0, 111, 0, 110, 0, 67, 0, 77, 0, 70, 0, 95, 0, 118, 0, 101, 0, 114, 0, 115, 0, 105, 0, 111, 0, 110, 0, 49, 0, 46, 0, 48, 0, 77, 0, 65, 0, 80, 0, 80, 0, 73, 0, 78, 0, 71, 0, 95, 0, 100, 0, 101, 0, 118, 0, 105, 0, 99, 0, 101, 0, 95, 0, 105, 0, 100, 0, 120, 0, 114, 0, 97, 0, 110, 0, 100, 0, 114, 0, 45, 0, 65, 0, 85, 0, 32, 0, 79, 0, 112, 0, 116, 0, 114, 0, 111, 0, 110, 0, 105, 0, 99, 0, 115, 0, 68, 0, 65, 0, 84, 0, 65, 0, 95, 0, 115, 0, 111, 0, 117, 0, 114, 0, 99, 0, 101, 0, 101, 0, 100, 0, 105, 0, 100, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 109, 0, 100, 0, 53, 0, 57, 0, 53, 0, 99, 0, 51, 0, 57, 0, 98, 0, 98, 0, 52, 0, 53, 0, 98, 0, 48, 0, 97, 0, 102, 0, 56, 0, 101, 0, 100, 0, 57, 0, 54, 0, 102, 0, 53, 0, 48, 0, 99, 0, 53, 0, 102, 0, 51, 0, 49, 0, 48, 0, 55, 0, 51, 0, 55, 0, 52, 0, 48, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 109, 0, 110, 0, 102, 0, 116, 0, 65, 0, 85, 0, 79, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 109, 0, 97, 0, 110, 0, 117, 0, 102, 0, 97, 0, 99, 0, 116, 0, 117, 0, 114, 0, 101, 0, 114, 0, 65, 0, 85, 0, 32, 0, 79, 0, 112, 0, 116, 0, 114, 0, 111, 0, 110, 0, 105, 0, 99, 0, 115, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 103, 0, 97, 0, 109, 0, 109, 0, 97, 0, 50, 0, 46, 0, 50, 0, 48, 0, 48, 0, 48, 0, 48, 0, 48, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 114, 0, 101, 0, 100, 0, 95, 0, 120, 0, 48, 0, 46, 0, 54, 0, 50, 0, 48, 0, 49, 0, 49, 0, 55, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 114, 0, 101, 0, 100, 0, 95, 0, 121, 0, 48, 0, 46, 0, 51, 0, 52, 0, 55, 0, 54, 0, 53, 0, 54, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 103, 0, 114, 0, 101, 0, 101, 0, 110, 0, 95, 0, 120, 0, 48, 0, 46, 0, 51, 0, 50, 0, 52, 0, 50, 0, 49, 0, 57, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 103, 0, 114, 0, 101, 0, 101, 0, 110, 0, 95, 0, 121, 0, 48, 0, 46, 0, 54, 0, 48, 0, 54, 0, 52, 0, 52, 0, 53, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 98, 0, 108, 0, 117, 0, 101, 0, 95, 0, 120, 0, 48, 0, 46, 0, 49, 0, 53, 0, 50, 0, 51, 0, 52, 0, 52, 0, 69, 0, 68, 0, 73, 0, 68, 0, 95, 0, 98, 0, 108, 0, 117, 0, 101, 0, 95, 0, 121, 0, 48, 0, 46, 0, 49, 0, 49, 0, 56, 0, 49, 0, 54, 0, 52, 0, 0
_METACITY_SENTINEL(CARDINAL) = 0
_NET_WORKAREA(CARDINAL) = 0, 0, 3840, 1080, 0, 0, 3840, 1080, 0, 0, 3840, 1080, 0, 0, 3840, 1080
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x280000a, 0x3a000ab, 0x4000001, 0x380000c, 0x380003d, 0xe00017, 0xe00007
_NET_CLIENT_LIST(WINDOW): window id # 0xe00007, 0xe00017, 0x280000a, 0x3a000ab, 0x4000001, 0x380000c, 0x380003d
_NET_DESKTOP_NAMES(UTF8_STRING) = "Workspace 1", "Workspace 2", "Workspace 3", "Workspace 4"
_NET_NUMBER_OF_DESKTOPS(CARDINAL) = 4
_NET_CURRENT_DESKTOP(CARDINAL) = 0
_NET_DESKTOP_GEOMETRY(CARDINAL) = 3840, 1080
_NET_DESKTOP_VIEWPORT(CARDINAL) = 0, 0
_NET_SUPPORTING_WM_CHECK(WINDOW): window id # 0x800003
_NET_SUPPORTED(ATOM) = _NET_WM_NAME, _NET_CLOSE_WINDOW, _NET_WM_STATE, _NET_WM_STATE_SHADED, _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_DESKTOP, _NET_NUMBER_OF_DESKTOPS, _NET_CURRENT_DESKTOP, _NET_WM_WINDOW_TYPE, _NET_WM_WINDOW_TYPE_DESKTOP, _NET_WM_WINDOW_TYPE_DOCK, _NET_WM_WINDOW_TYPE_TOOLBAR, _NET_WM_WINDOW_TYPE_MENU, _NET_WM_WINDOW_TYPE_DIALOG, _NET_WM_WINDOW_TYPE_NORMAL, _NET_WM_STATE_MODAL, _NET_CLIENT_LIST, _NET_CLIENT_LIST_STACKING, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_SKIP_PAGER, _NET_WM_ICON_NAME, _NET_WM_ICON, _NET_WM_ICON_GEOMETRY, _NET_WM_MOVERESIZE, _NET_ACTIVE_WINDOW, _NET_WM_STRUT, _NET_WM_STATE_HIDDEN, _NET_WM_WINDOW_TYPE_UTILITY, _NET_WM_WINDOW_TYPE_SPLASH, _NET_WM_STATE_FULLSCREEN, _NET_WM_PING, _NET_WM_PID, _NET_WORKAREA, _NET_SHOWING_DESKTOP, _NET_DESKTOP_LAYOUT, _NET_DESKTOP_NAMES, _NET_WM_ALLOWED_ACTIONS, _NET_WM_ACTION_MOVE, _NET_WM_ACTION_RESIZE, _NET_WM_ACTION_SHADE, _NET_WM_ACTION_STICK, _NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT, _NET_WM_ACTION_CHANGE_DESKTOP, _NET_WM_ACTION_CLOSE, _NET_WM_STATE_ABOVE, _NET_WM_STATE_BELOW, _NET_STARTUP_ID, _NET_WM_STRUT_PARTIAL, _NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_MINIMIZE, _NET_FRAME_EXTENTS, _NET_REQUEST_FRAME_EXTENTS, _NET_WM_USER_TIME, _NET_WM_STATE_DEMANDS_ATTENTION, _NET_MOVERESIZE_WINDOW, _NET_DESKTOP_GEOMETRY, _NET_DESKTOP_VIEWPORT, _NET_WM_USER_TIME_WINDOW, _NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW, _NET_WM_STATE_STICKY, _NET_WM_FULLSCREEN_MONITORS, _NET_RESTACK_WINDOW
WM_ICON_SIZE(CARDINAL):
minimum icon size: 32 by 32
maximum icon size: 32 by 32
incremental size change: 0 by 0
PULSE_COOKIE(STRING) = "d2ff5c3ac6f1f21b9fcf238a9fd6225c58c9061fc92489c49c1deb827bbdc6ed1349079494117aa504114885869bce9287c2ef7dcb1413ec0a51c87a97a81cf9224fe3601e49df0426893580b49956dac0c62cc4663a007868c79591c835e95733cdbf9ec617239f085985166c89a0fe2878cd311280ab707c3a0ed59032dbb4ea13dd5ab8ae5eb169f89fcff2f1107eaef4f00a8d8276124c889880630cc25fbde75a1cf60f72703f9c204d0fa6e3090e7e0aace19433f808e3766cf88843c1d7845539073784aaa5cb2dae7ab148a89ca00b6b4f8edd193c6e2d074f15dfdba5789d93cdf4b27f8add07e96f12c7450ad87e8fc5d7c9ef8589e1b689b25a9a"
PULSE_SERVER(STRING) = "{813e56ef1c4f171bda95b46b5448007c}unix:/run/user/1000/pulse/native"
PULSE_SESSION_ID(STRING) = "c1"
PULSE_ID(STRING) = "1000@813e56ef1c4f171bda95b46b5448007c/2019"
_GNOME_MAX_SCREEN_SIZE(CARDINAL) = 8192
_GNOME_SESSION_ACCELERATED(CARDINAL) = 1
XIM_SERVERS(ATOM) = @server=ibus
AT_SPI_BUS(STRING) = "unix:abstract=/tmp/dbus-vVCyXdujs4,guid=fafc826e479be42e070353a254b25c05"
RESOURCE_MANAGER(STRING) = "*customization:\t-color\nXft.dpi:\t96\nXft.antialias:\t1\nXft.hinting:\t1\nXft.hintstyle:\thintslight\nXft.rgba:\trgb\n"
_XKB_RULES_NAMES(STRING) = "evdev", "pc105", "gb,us", ",", ""
Xorg_Seat(STRING) = "seat0"
XFree86_has_VT(INTEGER) = 1
XFree86_VT(INTEGER) = 7

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment