--- /dev/null
+##############################################################################
+### The history window placement algorithm. ebind historyplacement.place ###
+### to the ob.EventAction.PlaceWindow event to use it. ###
+##############################################################################
+
+import windowplacement # fallback routines
+
+##############################################################################
+### Options for the historyplacement module: ###
+### ###
+# fallback - The window placement algorithm that will be used when history ###
+### placement does not have a place for the window. ###
+fallback = windowplacement.random ###
+### ###
+# filename - The name of the file where history data will be stored. The ###
+### number of the screen is appended onto this filename. ###
+filename = 'historydb' ###
+### ###
+##############################################################################
+
+import otk
+import ob
+import os
+import string
+
+_data = []
+
+class _state:
+ def __init__(self, appname, appclass, role, x, y):
+ self.appname = appname
+ self.appclass = appclass
+ self.role = role
+ self.x = x
+ self.y = y
+ def __eq__(self, other):
+ if self.appname == other.appname and \
+ self.appclass == other.appclass and \
+ self.role == other.role:
+ return 1
+ return 0
+
+def _load(data):
+ file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen),
+ 'r')
+ if file:
+ print "loading: "
+ # read data
+ for line in file.readlines():
+ line = line[:-1] # drop the '\n'
+ try:
+ print string.split(line, '\0')
+ print line.count('\0')
+ s = string.split(line, '\0')
+ state = _state(s[0], s[1], s[2],
+ string.atoi(s[3]), string.atoi(s[4]))
+
+ while len(_data)-1 < data.screen:
+ _data.append([])
+ _data[data.screen].append(state)
+
+ print " "+s[0]+" "+s[1]+" "+s[2]
+ print " " + str(s[3]) + "," + str(s[4])
+ except ValueError:
+ print "ValueError"
+ pass
+ except IndexError:
+ print "IndexError"
+ pass
+ print "DONE loading."
+ file.close()
+
+def _save(data):
+ file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen),
+ 'w')
+ if file:
+ print "saving: "
+ while len(_data)-1 < data.screen:
+ _data.append([])
+ for i in _data[data.screen]:
+ file.write(i.appname + '\0' +
+ i.appclass + '\0' +
+ i.role + '\0' +
+ str(i.x) + '\0' +
+ str(i.y) + '\n')
+ print " "+i.appname+" "+i.appclass+" "+i.role
+ print " " + str(i.x) + "," + str(i.y)
+ print "DONE saving."
+ file.close()
+
+def place(data):
+ print "placing"
+ if data.client:
+ state = _state(data.client.appName(), data.client.appClass(),
+ data.client.role(), 0, 0)
+ while len(_data)-1 < data.screen:
+ _data.append([])
+ print "looking for :"
+ print " " + state.appname
+ print " " + state.appclass
+ print " " + state.role
+ try:
+ i = _data[data.screen].index(state)
+ print "got it"
+ coords = _data[data.screen][i]
+ print "Found in history ("+str(coords.x)+","+str(coords.y)+")"
+ data.client.move(coords.x, coords.y)
+ except ValueError:
+ print "No match in history"
+ fallback(data)
+
+def _save_window(data):
+ print "saving"
+ if data.client:
+ area = data.client.area()
+ state = _state(data.client.appName(), data.client.appClass(),
+ data.client.role(), area.x(), area.y())
+ while len(_data)-1 < data.screen:
+ _data.append([])
+ print "looking for :"
+ print " " + state.appname
+ print " " + state.appclass
+ print " " + state.role
+ try:
+ i = _data[data.screen].index(state)
+ print "replacing"
+ _data[data.screen][i] = state # replace it
+ except ValueError:
+ print "appending"
+ _data[data.screen].append(state)
+
+ob.ebind(ob.EventAction.CloseWindow, _save_window)
+ob.ebind(ob.EventAction.Startup, _load)
+ob.ebind(ob.EventAction.Shutdown, _save)
+
+print "Loaded historyplacement.py"