X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=scripts%2Fhistoryplacement.py;h=fb1dd35b4d4cb55d70dce4a963d0d0f780973b39;hb=f8a47de5ec444c452093371e3db16857eb39a490;hp=2ebd9a280886afdeabb50c32772bc96621de6bb7;hpb=28a08b7d68f1168f0e35ef3faaacdf052be55eef;p=chaz%2Fopenbox diff --git a/scripts/historyplacement.py b/scripts/historyplacement.py index 2ebd9a28..fb1dd35b 100644 --- a/scripts/historyplacement.py +++ b/scripts/historyplacement.py @@ -3,31 +3,58 @@ ### to the ob.EventAction.PlaceWindow event to use it. ### ############################################################################## -import windowplacement # fallback routines +import windowplacement, config + +def place(data): + """Place a window usingthe history placement algorithm.""" + _place(data) + +export_functions = place -############################################################################## -### 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 ### -# ignore_requested_positions - When true, the history algorithm will ### -### attempt to place windows even when they ### -### request a position (like XMMS). ### -ignore_requested_positions = 0 ### -# confirm_callback - set this to a function to have the function called ### -### before attempting to place a window via history. If ### -### the function returns 'true' then an attempt will be ### -### made to place the window. If it returns 'false', the ### -### fallback method will be directly applied instead. ### -confirm_callback = 0 ### -### ### -# filename - The name of the file where history data will be stored. The ### -### number of the screen is appended onto this filename. ### -filename = 'historydb' ### -### ### ############################################################################## +config.add('historyplacement', + 'ignore_requested_positions', + 'Ignore Requested Positions', + "When true, the placement algorithm will attempt to place " + \ + "windows even when they request a position (like XMMS can)." + \ + "Note this only applies to 'normal' windows, not to special " + \ + "cases like desktops and docks.", + 'boolean', + 0) +config.add('historyplacement', + 'dont_duplicate', + "Don't Diplicate", + "When true, 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 Algorithm' will be "+\ + "used instead.", + 'boolean', + 1) +config.add('historyplacement', + 'filename', + 'History Database Filename', + "The name of the file where history data will be stored. The " + \ + "number of the screen is appended onto this name. The file will " +\ + "be placed in ~/.openbox/.", + 'string', + 'historydb') +config.add('historyplacement', + 'fallback', + 'Fallback Algorithm', + "The window placement algorithm that will be used when history " + \ + "placement does not have a place for the window.", + 'enum', + windowplacement.random, + options = windowplacement.export_functions) + +########################################################################### + +########################################################################### +### Internal stuff, should not be accessed outside the module. ### +########################################################################### + import otk import ob import os @@ -42,6 +69,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 \ @@ -51,9 +79,10 @@ class _state: def _load(data): global _data - file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen), - 'r') - if file: + try: + file = open(os.environ['HOME'] + '/.openbox/' + \ + config.get('historyplacement', 'filename') + \ + "." + str(data.screen), 'r') # read data for line in file.readlines(): line = line[:-1] # drop the '\n' @@ -66,16 +95,16 @@ def _load(data): _data.append([]) _data[data.screen].append(state) - except ValueError: - pass - except IndexError: - pass + except ValueError: pass + except IndexError: pass file.close() + except IOError: pass def _save(data): global _data - file = open(os.environ['HOME']+'/.openbox/'+filename+"."+str(data.screen), - 'w') + file = open(os.environ['HOME']+'/.openbox/'+ \ + config.get('historyplacement', 'filename') + \ + "." + str(data.screen), 'w') if file: while len(_data)-1 < data.screen: _data.append([]) @@ -104,28 +133,34 @@ def _find(screen, state): _data.append([]) return _find(screen, state) # try again -def place(data): +def _place(data): global _data if data.client: - if not ignore_requested_positions: + if not (config.get('historyplacement', 'ignore_requested_positions') \ + and data.client.normal()): if data.client.positionRequested(): return state = _create_state(data) try: - 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)+")" + 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 (config.get('historyplacement', 'dont_duplicate') \ + and coords.placed): data.client.move(coords.x, coords.y) + coords.placed = 1 return else: - print "No match in history" + print "Already placed another window there" + else: + print "No match in history" except TypeError: pass + fallback = config.get('historyplacement', 'fallback') if fallback: fallback(data) def _save_window(data):