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()