Xfce Wiki

Sub domains
 

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