X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=scripts%2Ffocus.py;h=79da5a211d0349919c6238771627448787ae89f9;hb=80a42d2b0c0831e99b2b5547e8ddc0122796d78a;hp=c0d60b1ee7bb06308f05cd65d5ea268e3738a42a;hpb=18ab2453077197a789448ce692c7e21436cca34b;p=chaz%2Fopenbox diff --git a/scripts/focus.py b/scripts/focus.py index c0d60b1e..79da5a21 100644 --- a/scripts/focus.py +++ b/scripts/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): @@ -53,10 +59,11 @@ def focus_next(data, num=1, forward=1): for i in r: if found: target = i + found = 2 break elif screen.client(i).window() == client_win: found = 1 - if not found: # wraparound + if found == 1: # wraparound if forward: target = 0 else: target = count - 1 @@ -74,7 +81,7 @@ def focus_next(data, num=1, forward=1): t += num if t >= count: t -= count else: - t -= 1 + t -= num if t < 0: t += count if t == target: return # nothing to focus