scripts/historyplacement.py (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 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" |