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