]> icculus.org git repositories - mikachu/openbox.git/blob - scripts/focus.py
make python config variables very visible by making them all capitals. cleaner nicer...
[mikachu/openbox.git] / scripts / focus.py
1 ###########################################################################
2 ###          Functions for helping out with your window focus.          ###
3 ###########################################################################
4
5 ###########################################################################
6 ###         Options that affect the behavior of the focus module.       ###
7 ###########################################################################
8 AVOID_SKIP_TASKBAR = 1
9 """Don't focus windows which have requested to not be displayed in taskbars.
10    You will still be able to focus the windows, but not through cycling, and
11    they won't be focused as a fallback if 'fallback' is enabled."""
12 FALLBACK = 0
13 """Send focus somewhere when nothing is left with the focus, if possible."""
14 ###########################################################################
15
16 ###########################################################################
17 ###########################################################################
18
19 ###########################################################################
20 ###      Internal stuff, should not be accessed outside the module.     ###
21 ###########################################################################
22
23 import ob
24
25 # maintain a list of clients, stacked in focus order
26 _clients = []
27 _disable = 0
28
29 def _focusable(client, desktop):
30     if not client.normal(): return 0
31     if not (client.canFocus() or client.focusNotify()): return 0
32     if AVOID_SKIP_TASKBAR and client.skipTaskbar(): return 0
33
34     desk = client.desktop()
35     if not (desk == 0xffffffff or desk == desktop): return 0
36
37     return 1
38
39 def _focused(data):
40     global _clients
41
42     if _disable: return
43
44     if data.client:
45         win = data.client.window()
46         # move it to the top
47         _clients.remove(win)
48         _clients.insert(0, win)
49     elif FALLBACK:
50         # pass around focus
51         desktop = ob.openbox.screen(data.screen).desktop()
52         for w in _clients:
53             client = ob.openbox.findClient(w)
54             if client and _focusable(client, desktop) and client.focus():
55                 break
56
57 def _newwindow(data):
58     _clients.append(data.client.window())
59         
60 def _closewindow(data):
61     try:
62         _clients.remove(data.client.window())
63     except ValueError: pass
64
65 ob.ebind(ob.EventAction.NewWindow, _newwindow)
66 ob.ebind(ob.EventAction.CloseWindow, _closewindow)
67 ob.ebind(ob.EventAction.Focus, _focused)
68
69 print "Loaded focus.py"