This is an old revision of the document!
Window-Grid
Similar to the Window-Grid-PlugIn for Compiz (Link needed) features this python-script some placing capabilities.
TODO:
- find some way to store the window state (int; 1, 2, or 3) with the window
- hope for fixing of this bug
If there are questions, please ask (and help).
#!/usr/bin/python2 # -*- coding: utf-8 -*-
import sys import argparse from gtk import gdk import wnck
PACKAGE = “window_grid”
def argument_parser():
"""
The argument parser. Takes only one number from the cmd line in the range of
0 to 10.
"""
parser = argparse.ArgumentParser(description='Tile the current window.')
parser.add_argument('position',
metavar='N',
type=int,
help='an integer describing the position',
choices = xrange(10)
)
return parser.parse_args()
def active_window():
""" Returns the default screen, but it fails uncatchable when not called from X. """ screen = wnck.screen_get_default() screen.force_update() return(screen.get_active_window())
def get_geometry():
# just a shorting for wnck.Window.get_geometry(active_window()) return(active_window().get_geometry())
def window_state(head, sub = int(1)):
"""
Returns the upper left edge and the dimensions of the current window.
The HeadMap showing the screen; 4, 5 and 6 are vertical full,
2, 5 and 8 are horizontal full.
┌─────────────────┬─────────────────┐
│ ┆ │
│ 7 8 9 │
│ ┆ │
├┄┄┄┄┄┄┄╴4╶┄┄┄┄┄┄╴5╶┄┄┄┄┄┄╴6╶┄┄┄┄┄┄┄┤
│ ┆ │
│ 1 2 3 │
│ ┆ │
└─────────────────┴─────────────────┘
The SubMap showing the widths
┌─────────────────┐
│ │
│ 1 │
│ │
└─────────────────┘
┌───────────────────────┐
│ │
│ 2 │
│ │
└───────────────────────┘
┌───────────┐
│ │
│ 3 │
│ │
└───────────┘
"""
head = int(head)
root_win = gdk.get_default_root_window()
win_property = gdk.atom_intern("_NET_WORKAREA")
win_property_array = root_win.property_get(win_property)[2]
x_offset = win_property_array[0]
y_offset = win_property_array[1]
x_wa = win_property_array[2]
y_wa = win_property_array[3]
x_sub_map = {1: x_wa / 2, 2: x_wa / 3 * 2, 3: x_wa / 3}
if (head % 3) == 1:
x = x_offset
width = x_sub_map[sub]
elif (head % 3) == 2:
if sub == 1:
x = x_offset
width = x_wa
else:
x = x_wa / 3 + x_offset
width = x_wa / 3
else:
x = x_wa - x_sub_map[sub] + x_offset
width = x_sub_map[sub]
if (7 <= head <= 9):
y = y_offset
height = y_wa / 2
elif (4 <= head <= 6):
y = y_offset
height = y_wa
else:
y = y_wa / 2 + y_offset
height = y_wa / 2
return(int(x), int(y), int(width), int(height))
def set_geometry(geo_list):
"""
DOC: http://library.gnome.org/devel/libwnck/stable/WnckWindow.html#wnck-window-set-geometry
gravity: 0 - current gravity
1 - top left
2 - top center 1 2 3
3 - top right ┏━╾─┴─╼━┓
4 - center left ╿ ╿
5 - center center 4┤ 5 ├6
6 - center right ╽ ╽
7 - bottom left ┗━╾─┬─╼━┛
8 - bottom center 7 8 9
9 - bottom right
10 - static (top left)
Only 10 does what I want… all the other gravities (even 1) don't set
the windows right (Kind of bug? Maybe. Does it bother me? No, not really).
"""
window = active_window()
window.unmaximize_horizontally()
window.unmaximize_vertically()
window.set_geometry(10, 15, geo_list[0], geo_list[1], geo_list[2], geo_list[3])
return 0
def main():
args = argument_parser()
if args.position == 0:
print get_geometry()
sys.exit(0)
#print('%s' % active_window().get_data('submap'))
if active_window().get_data('submap') == '1':
#print('Known state! Switch to SubMap 2!')
set_geometry(window_state(args.position, 2))
active_window().set_data('submap', 2)
elif active_window().get_data('submap') == '2':
if (args.position % 3) == 2:
#print('Known state! Switch to SubMap 1!')
set_geometry(window_state(args.position, 1))
active_window().set_data('submap', 1)
else:
#print('Known state! Switch to SubMap 3!')
set_geometry(window_state(args.position, 3))
active_window().set_data('submap', 3)
elif active_window().get_data('submap') == '3':
#print('Known state! Switch to SubMap 1!')
set_geometry(window_state(args.position, 1))
active_window().set_data('submap', 1)
else:
set_geometry(window_state(args.position, 1))
active_window().set_data('submap', 1)
#print('%s' % active_window().get_data('submap'))
sys.exit((0))
if name == 'main':
main()