X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=scripts%2Ffocus.py;h=3bbf600fed1a9dcb6f0fa9eeb23a67c30ea89439;hb=f789d4a615b9d9990dd25008457959937a6713c4;hp=084faebaa1f989969904b9615a96fdda03df6126;hpb=707f70682abe0dfaadbf76843a0dccb33f0eaeda;p=chaz%2Fopenbox diff --git a/scripts/focus.py b/scripts/focus.py index 084faeba..3bbf600f 100644 --- a/scripts/focus.py +++ b/scripts/focus.py @@ -2,85 +2,85 @@ ### Functions for helping out with your window focus. ### ########################################################################### -ob_focus_raise = 1 -ob_focus_fallback = 0 -ob_focus_stack = [] +########################################################################### +### Options that affect the behavior of the focus module. ### +########################################################################### +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.""" +FALLBACK = 0 +"""Send focus somewhere when nothing is left with the focus, if possible.""" +########################################################################### -def ob_focused(data): - global ob_focus_raise - global ob_focus_fallback - global ob_focus_stack - if data.client: - window = data.client.window() - # add/move to front the stack - if window in ob_focus_stack: - ob_focus_stack.remove(window) - ob_focus_stack.insert(0, window) - elif ob_focus_fallback: - # pass around focus - desktop = openbox.screen(data.screen).desktop() - l = len(ob_focus_stack) - i = 0 - while i < l: - w = ob_focus_stack[i] - client = openbox.findClient(w) - if not client: # window is gone, remove it - ob_focus_stack.pop(i) - l = l - 1 - elif client.desktop() == desktop and \ - client.normal() and client.focus(): - break - else: - i = i + 1 +########################################################################### +########################################################################### + +########################################################################### +### Internal stuff, should not be accessed outside the module. ### +########################################################################### + +import ob + +# maintain a list of clients, stacked in focus order +_clients = [] +_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() + if not (desk == 0xffffffff or desk == desktop): return 0 -ebind(EventFocus, ob_focused) + return 1 -def focus_next(data, num=1, forward=1): - """Focus the next (or previous, with forward=0) window in a linear - order.""" - screen = openbox.screen(data.screen) - count = screen.clientCount() +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 _skip: + global _skip + _skip -= 1 + return - 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 + # move it to the top + 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 c in _clients: + if _focusable(c, desktop) and c.focus(): break - elif screen.client(i).window() == client_win: - found = 1 - if not found: # wraparound - if forward: target = 0 - else: target = count - 1 - t = target - curdesk = screen.desktop() - while 1: - client = screen.client(t) - if client.normal() and \ - (client.desktop() == curdesk or client.desktop() == 0xffffffff)\ - and client.focus(): - if ob_focus_raise: - screen.raiseWindow(client) +def _newwindow(data): + # make sure its not already in the list + win = data.client.window() + for i in range(len(_clients)): + if _clients[i].window() == win: return - if forward: - t += 1 - if t == count: t = 0 - else: - t -= 1 - if t < 0: t = count - 1 - if t == target: return # nothing to focus - -def focus_prev(data, num=1): - """Focus the previous window in a linear order.""" - focus_next(data, num, forward=0) + _clients.append(data.client) + +def _closewindow(data): + _remove(data.client) +ob.ebind(ob.EventAction.NewWindow, _newwindow) +ob.ebind(ob.EventAction.CloseWindow, _closewindow) +ob.ebind(ob.EventAction.Focus, _focused) print "Loaded focus.py"