all repos — openbox @ e1e5293ae354ab7b1c8459aab85e60e1a801924d

openbox fork - make it a bit more like ryudo

historyplacement!!
Dana Jansens danakj@orodu.net
commit

e1e5293ae354ab7b1c8459aab85e60e1a801924d

parent

fe9fb53a7b28e8c156bb68a3968057ad8808cdee

3 files changed, 141 insertions(+), 1 deletions(-)

jump to
M scripts/Makefile.amscripts/Makefile.am

@@ -1,7 +1,8 @@

scriptdir = $(libdir)/openbox/python MAINTAINERCLEANFILES = Makefile.in script_DATA = config.py builtins.py defaults.py focus.py callbacks.py \ - focusmodel.py windowplacement.py behavior.py motion.py + focusmodel.py windowplacement.py behavior.py motion.py \ + historyplacement.py EXTRA_DIST = $(script_DATA) distclean-local:
A scripts/historyplacement.py

@@ -0,0 +1,135 @@

+############################################################################## +### 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"
M scripts/windowplacement.pyscripts/windowplacement.py

@@ -1,6 +1,10 @@

############################################################################ ### Window placement algorithms, choose one of these and ebind it to the ### ### ob.EventAction.PlaceWindow event. ### +### ### +### Also see historyplacement.py for the history placement module which ### +### provides an algorithm that can be used in place of, or alongside ### +### these. ### ############################################################################ import otk