X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Ffocus.py;h=dbaf4bc444b87f293c9bb2268297f99c4c81bb83;hb=dca8c61a91cab29128a72f252b70f4bd9f7786ff;hp=b1b169e1487e034e5d52318da5e5506cd939479c;hpb=220b5c40f91c6509951ccd0d506a9bd77d9d6bac;p=chaz%2Fopenbox diff --git a/scripts/focus.py b/scripts/focus.py index b1b169e1..dbaf4bc4 100644 --- a/scripts/focus.py +++ b/scripts/focus.py @@ -24,11 +24,12 @@ import ob # maintain a list of clients, stacked in focus order _clients = [] -_disable = 0 +_skip = 0 def _focusable(client, desktop): if not client.normal(): return 0 if not (client.canFocus() or client.focusNotify()): return 0 + if client.iconic(): return 0 if AVOID_SKIP_TASKBAR and client.skipTaskbar(): return 0 desk = client.desktop() @@ -36,31 +37,46 @@ def _focusable(client, desktop): return 1 +def _remove(client): + """This function exists because Swig pointers don't define a __eq__ + function, so list.remove(ptr) does not work.""" + win = client.window() + for i in range(len(_clients)): + if _clients[i].window() == win: + _clients.pop(i) + return + raise ValueError("_remove(x): x not in _clients list.") + def _focused(data): - global _clients + global _clients, _skip - if _disable: return + if _skip: + _skip -= 1 + return if data.client: - win = data.client.window() # move it to the top - _clients.remove(win) - _clients.insert(0, win) + try: + _remove(data.client) + except ValueError: pass # happens if _focused comes before _newwindow + _clients.insert(0, data.client) elif FALLBACK: # pass around focus desktop = ob.openbox.screen(data.screen).desktop() - for w in _clients: - client = ob.openbox.findClient(w) - if client and _focusable(client, desktop) and client.focus(): + for c in _clients: + if _focusable(c, desktop) and c.focus(): break def _newwindow(data): - _clients.append(data.client.window()) + # make sure its not already in the list + win = data.client.window() + for i in range(len(_clients)): + if _clients[i].window() == win: + return + _clients.append(data.client) def _closewindow(data): - try: - _clients.remove(data.client.window()) - except ValueError: pass + _remove(data.client) ob.ebind(ob.EventAction.NewWindow, _newwindow) ob.ebind(ob.EventAction.CloseWindow, _closewindow)