X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Fhistoryplacement.py;h=63f19f0406168f44e69aa3cbd65e4ecd0c44619b;hb=781495e2eafd9dfe5592a2f5cefb905743208175;hp=8f44030aeb6a95cc693a84da1d970763b8dc9f48;hpb=e1e5293ae354ab7b1c8459aab85e60e1a801924d;p=chaz%2Fopenbox diff --git a/scripts/historyplacement.py b/scripts/historyplacement.py index 8f44030a..63f19f04 100644 --- a/scripts/historyplacement.py +++ b/scripts/historyplacement.py @@ -6,17 +6,41 @@ 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' ### -### ### +### Options for the historyplacement module (Options in the ### +### windowplacement module also apply!) ### ############################################################################## +IGNORE_REQUESTED_POSITIONS = 0 +"""When non-zero, the placement algorithm will attempt to place windows even + when they request a position (like XMMS). Note this only applies to normal + windows, not to special cases like desktops and docks.""" +DONT_DUPLICATE = 1 +"""When non-zero, if 2 copies of the same match in history are to be placed + before one of them is closed (so it would be placed over-top of the last + one), this will cause the second window to not be placed via history, and + the FALLBACK will be used instead.""" +FALLBACK = windowplacement.random +"""The window placement algorithm that will be used when history placement + does not have a place for the window.""" +CONFIRM_CALLBACK = 0 +"""Set this to a function to have the function called before attempting to + place a window via history. If the function returns a non-zero, then an + attempt will be made to place the window. If it returns zero, the + FALLBACK method will be directly applied instead.""" +FILENAME = 'historydb' +"""The name of the file where history data will be stored. The number of + the screen is appended onto this filename.""" +############################################################################## + +def place(data): + """Place a window usingthe history placement algorithm.""" + _place(data) + +########################################################################### +########################################################################### + +########################################################################### +### Internal stuff, should not be accessed outside the module. ### +########################################################################### import otk import ob @@ -32,6 +56,7 @@ class _state: self.role = role self.x = x self.y = y + self.placed = 0 def __eq__(self, other): if self.appname == other.appname and \ self.appclass == other.appclass and \ @@ -40,16 +65,14 @@ class _state: return 0 def _load(data): - file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen), - 'r') - if file: - print "loading: " + global _data + try: + file = open(os.environ['HOME'] + '/.openbox/' + FILENAME+"." + + str(data.screen), 'r') # 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])) @@ -58,22 +81,16 @@ def _load(data): _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." + except ValueError: pass + except IndexError: pass file.close() + except IOError: pass def _save(data): - file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen), + global _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]: @@ -82,49 +99,65 @@ def _save(data): 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: +def _create_state(data): + global _data + area = data.client.area() + return _state(data.client.appName(), data.client.appClass(), + data.client.role(), area.x(), area.y()) + +def _find(screen, state): + global _data + try: + return _data[screen].index(state) + except ValueError: + return -1 + except IndexError: + while len(_data)-1 < screen: _data.append([]) - print "looking for :" - print " " + state.appname - print " " + state.appclass - print " " + state.role + return _find(screen, state) # try again + +def _place(data): + global _data + if data.client: + if not (IGNORE_REQUESTED_POSITIONS and data.client.normal()): + if data.client.positionRequested(): return + state = _create_state(data) 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) + if not CONFIRM_CALLBACK or CONFIRM_CALLBACK(data): + print "looking for : " + state.appname + " : " + \ + state.appclass + " : " + state.role + + i = _find(data.screen, state) + if i >= 0: + coords = _data[data.screen][i] + print "Found in history ("+str(coords.x)+","+\ + str(coords.y)+")" + if not (DONT_DUPLICATE and coords.placed): + data.client.move(coords.x, coords.y) + coords.placed = 1 + return + else: + print "Already placed another window there" + else: + print "No match in history" + except TypeError: + pass + if FALLBACK: FALLBACK(data) def _save_window(data): - print "saving" + global _data 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) + state = _create_state(data) + print "looking for : " + state.appname + " : " + state.appclass + \ + " : " + state.role + + i = _find(data.screen, state) + if i >= 0: print "replacing" _data[data.screen][i] = state # replace it - except ValueError: + else: print "appending" _data[data.screen].append(state)