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:

  • wrote the help
  • 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.


  #!/usr/bin/python2
  # -*- coding: utf-8 -*-
  import sys
  import os
  import wnck
  from Xlib import display
  from xfce4 import xfconf
  PACKAGE = "window_grid"
  def _help_():
      print(u'Help:')
      print(u'Lorem ipsum dolores…')
      return(0)
  def active_window():
      # returns the default screen, but it fails when not called from X
      # TODO: connect to the dbus-session-bus to get the right environment
      # (like $DISPLAY)
      screen = wnck.screen_get_default()
      screen.force_update()
      return(screen.get_active_window())
  def get_resolution(orientation):
      # Accept only 'width' and 'height' for the specific resolution
      return display.Display.screen(display.Display())[orientation +
         '_in_pixels']
  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)):
      # 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)
      x_res = get_resolution(u'width')
      y_res = get_resolution(u'height')
      x_sub_map = {1: x_res / 2, 2: x_res / 3 * 2, 3: x_res / 3}
      if (head % 3) == 1:
          x = 0
          width = x_sub_map[sub]
      elif (head % 3) == 2:
          if sub == 1:
              x = 0
              width = x_res
          else:
              x = x_res / 3
              width = x_res / 3
      else:
          x = x_res - x_sub_map[sub]
          width = x_sub_map[sub]
      if (7 <= head <= 9):
          y = 0
          height = y_res / 2
      elif (4 <= head <= 6):
          y = 0
          height = y_res
      else:
          y = y_res / 2
          height = y_res / 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
      active_window().unmaximize_horizontally()
      active_window().unmaximize_vertically()
      active_window().set_geometry(10, 15, geo_list[0], geo_list[1], geo_list[2], geo_list[3])
      return 0
  
  def main():
      if len(sys.argv) > 2:
          print('Too many arguments! Only one allowed!')
          _help_()
          sys.exit(1)
      if len(sys.argv) < 2:
          print('Too few arguments! At least one required!')
          _help_()
          sys.exit(1)
      try:
          cmd_arg = int(str(sys.argv[1]))
      except ValueError:
          print('Wrong argument!')
          _help_()
          sys.exit(1)
      if cmd_arg == 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(cmd_arg, 2))
          active_window().set_data('submap', 2)
      elif active_window().get_data('submap') == '2':
          if (cmd_arg % 3) == 2:
              print('Known state! Switch to SubMap 1!')
              set_geometry(window_state(cmd_arg, 1))
              active_window().set_data('submap', 1)
          else:
              print('Known state! Switch to SubMap 3!')
              set_geometry(window_state(cmd_arg, 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(cmd_arg, 1))
          active_window().set_data('submap', 1)
      else:
          set_geometry(window_state(cmd_arg, 1))
          active_window().set_data('submap', 1)
      print('%s' % active_window().get_data('submap'))
      sys.exit(0)
  if __name__ == '__main__':
      main()