]> Dogcows Code - chaz/openbox/blobdiff - scripts/focus.py
bold non-shadowed font
[chaz/openbox] / scripts / focus.py
index 084faebaa1f989969904b9615a96fdda03df6126..79da5a211d0349919c6238771627448787ae89f9 100644 (file)
@@ -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
 
@@ -71,11 +78,11 @@ def focus_next(data, num=1, forward=1):
                 screen.raiseWindow(client)
             return
         if forward:
-            t += 1
-            if t == count: t = 0
+            t += num
+            if t >= count: t -= count
         else:
-            t -= 1
-            if t < 0: t = count - 1
+            t -= num
+            if t < 0: t += count
         if t == target: return # nothing to focus
 
 def focus_prev(data, num=1):
This page took 0.023653 seconds and 4 git commands to generate.