Created
January 11, 2015 11:06
-
-
Save avilella/fdbd3def8a9648037406 to your computer and use it in GitHub Desktop.
Aero snap using xdotool
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
#!/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) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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