X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Ffocus.py;h=3bbf600fed1a9dcb6f0fa9eeb23a67c30ea89439;hb=f789d4a615b9d9990dd25008457959937a6713c4;hp=03c50f41a450957411397a7db1e509c1be2a5402;hpb=00978e674a53cf95693d3a58c28508f557ec6a0f;p=chaz%2Fopenbox diff --git a/scripts/focus.py b/scripts/focus.py index 03c50f41..3bbf600f 100644 --- a/scripts/focus.py +++ b/scripts/focus.py @@ -5,25 +5,14 @@ ########################################################################### ### Options that affect the behavior of the focus module. ### ########################################################################### -avoid_skip_taskbar = 1 +AVOID_SKIP_TASKBAR = 1 """Don't focus windows which have requested to not be displayed in taskbars. You will still be able to focus the windows, but not through cycling, and they won't be focused as a fallback if 'fallback' is enabled.""" -raise_window = 1 -"""When cycling focus, raise the window chosen as well as focusing it. This - does not affect fallback focusing behavior.""" -fallback = 0 +FALLBACK = 0 """Send focus somewhere when nothing is left with the focus, if possible.""" ########################################################################### -def next(data, num=1): - """Focus the next window.""" - _cycle(data, num, 1) - -def previous(data, num=1): - """Focus the previous window.""" - _cycle(data, num, 0) - ########################################################################### ########################################################################### @@ -31,93 +20,67 @@ def previous(data, num=1): ### Internal stuff, should not be accessed outside the module. ### ########################################################################### -import otk 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 avoid_skip_taskbar and client.skipTaskbar(): return 0 + if client.iconic(): return 0 + if AVOID_SKIP_TASKBAR and client.skipTaskbar(): return 0 desk = client.desktop() if not (desk == 0xffffffff or desk == desktop): return 0 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 - if _disable: return + if _skip: + global _skip + _skip -= 1 + return if data.client: - win = data.client.window() # move it to the top - _clients.remove(win) - _clients.insert(0, win) - elif fallback: + 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) ob.ebind(ob.EventAction.Focus, _focused) -def _cycle(data, num, forward): - global avoid_skip_taskbar - - screen = ob.openbox.screen(data.screen) - count = screen.clientCount() - - if not count: return # no clients - - target = 0 - if data.client: - client_win = data.client.window() - found = 0 - r = range(count) - if not forward: - r.reverse() - for i in r: - if found: - target = i - found = 2 - break - elif screen.client(i).window() == client_win: - found = 1 - if found == 1: # wraparound - if forward: target = 0 - else: target = count - 1 - - t = target - desktop = screen.desktop() - while 1: - client = screen.client(t) - if client and _focusable(client, desktop) and client.focus(): - if cycle_raise: - screen.raiseWindow(client) - return - if forward: - t += num - if t >= count: t -= count - else: - t -= num - if t < 0: t += count - if t == target: return # nothing to focus - print "Loaded focus.py"