all repos — openbox @ ff98438acca3ae7ca0b2be66cb39cc29643ecaba

openbox fork - make it a bit more like ryudo

keep a list of clients in the order that they have been focused
Dana Jansens danakj@orodu.net
commit

ff98438acca3ae7ca0b2be66cb39cc29643ecaba

parent

f4b87e04a2a1d285f7b6f93b3db08f040ba5c32c

1 files changed, 26 insertions(+), 20 deletions(-)

jump to
M scripts/focus.pyscripts/focus.py

@@ -4,35 +4,41 @@ ###########################################################################

ob_focus_raise = 1 ob_focus_fallback = 0 -ob_focus_stack = [] + +# maintain a list of clients, stacked in focus order +ob_clients = [] +# maintaint he current focused window +ob_focused = 0; + +def ob_new_win(data): + global ob_clients + if not len(ob_clients): ob_clients.append(data.client.window()) + else: ob_clients.insert(1, data.client.window()) # insert in 2nd slot + +def ob_close_win(data): + global ob_clients + ob_clients.remove(data.client.window()) def ob_focused(data): - global ob_focus_raise - global ob_focus_fallback - global ob_focus_stack + global ob_clients 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) + win = data.client.window() + ob_focused = win + # move it to the top + ob_clients.remove(win) + ob_clients.insert(0, win) elif ob_focus_fallback: # pass around focus + ob_focused = 0 desktop = openbox.screen(data.screen).desktop() - l = len(ob_focus_stack) - i = 0 - while i < l: - w = ob_focus_stack[i] + for w in ob_clients: 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(): + if client and (client.desktop() == desktop and \ + client.normal() and client.focus()): break - else: - i = i + 1 +ebind(EventNewWindow, ob_new_win) +ebind(EventCloseWindow, ob_close_win) ebind(EventFocus, ob_focused) def focus_next(data, num=1, forward=1):