split out the linear cycling into focuscycle.py.
some better comments about what options can be used.
This commit is contained in:
parent
00978e674a
commit
8a05ae261d
4 changed files with 79 additions and 57 deletions
|
@ -2,7 +2,7 @@ scriptdir = $(libdir)/openbox/python
|
|||
MAINTAINERCLEANFILES = Makefile.in
|
||||
script_DATA = config.py defaults.py focus.py callbacks.py \
|
||||
focusmodel.py windowplacement.py behavior.py motion.py \
|
||||
historyplacement.py stackedcycle.py
|
||||
historyplacement.py stackedcycle.py focuscycle.py
|
||||
EXTRA_DIST = $(script_DATA)
|
||||
|
||||
distclean-local:
|
||||
|
|
|
@ -9,21 +9,10 @@ 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."""
|
||||
raise_window = 1
|
||||
"""When cycling focus, raise the window chosen as well as focusing it. This
|
||||
does not affect fallback focusing behavior."""
|
||||
fallback = 0
|
||||
"""Send focus somewhere when nothing is left with the focus, if possible."""
|
||||
###########################################################################
|
||||
|
||||
def next(data, num=1):
|
||||
"""Focus the next window."""
|
||||
_cycle(data, num, 1)
|
||||
|
||||
def previous(data, num=1):
|
||||
"""Focus the previous window."""
|
||||
_cycle(data, num, 0)
|
||||
|
||||
###########################################################################
|
||||
###########################################################################
|
||||
|
||||
|
@ -31,7 +20,6 @@ def previous(data, num=1):
|
|||
### Internal stuff, should not be accessed outside the module. ###
|
||||
###########################################################################
|
||||
|
||||
import otk
|
||||
import ob
|
||||
|
||||
# maintain a list of clients, stacked in focus order
|
||||
|
@ -78,46 +66,4 @@ ob.ebind(ob.EventAction.NewWindow, _newwindow)
|
|||
ob.ebind(ob.EventAction.CloseWindow, _closewindow)
|
||||
ob.ebind(ob.EventAction.Focus, _focused)
|
||||
|
||||
def _cycle(data, num, forward):
|
||||
global avoid_skip_taskbar
|
||||
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
count = screen.clientCount()
|
||||
|
||||
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
|
||||
found = 2
|
||||
break
|
||||
elif screen.client(i).window() == client_win:
|
||||
found = 1
|
||||
if found == 1: # wraparound
|
||||
if forward: target = 0
|
||||
else: target = count - 1
|
||||
|
||||
t = target
|
||||
desktop = screen.desktop()
|
||||
while 1:
|
||||
client = screen.client(t)
|
||||
if client and _focusable(client, desktop) and client.focus():
|
||||
if cycle_raise:
|
||||
screen.raiseWindow(client)
|
||||
return
|
||||
if forward:
|
||||
t += num
|
||||
if t >= count: t -= count
|
||||
else:
|
||||
t -= num
|
||||
if t < 0: t += count
|
||||
if t == target: return # nothing to focus
|
||||
|
||||
print "Loaded focus.py"
|
||||
|
|
72
scripts/focuscycle.py
Normal file
72
scripts/focuscycle.py
Normal file
|
@ -0,0 +1,72 @@
|
|||
###########################################################################
|
||||
### Functions for cycling focus (in a 'linear' order) between windows. ###
|
||||
###########################################################################
|
||||
|
||||
###########################################################################
|
||||
### Options that affect the behavior of the focuscycle module. ###
|
||||
###########################################################################
|
||||
raise_window = 1
|
||||
"""When cycling focus, raise the window chosen as well as focusing it. This
|
||||
does not affect fallback focusing behavior."""
|
||||
# See focus.avoid_skip_taskbar
|
||||
###########################################################################
|
||||
|
||||
def next(data, num=1):
|
||||
"""Focus the next window."""
|
||||
_cycle(data, num, 1)
|
||||
|
||||
def previous(data, num=1):
|
||||
"""Focus the previous window."""
|
||||
_cycle(data, num, 0)
|
||||
|
||||
###########################################################################
|
||||
###########################################################################
|
||||
|
||||
###########################################################################
|
||||
### Internal stuff, should not be accessed outside the module. ###
|
||||
###########################################################################
|
||||
|
||||
import ob
|
||||
import focus
|
||||
|
||||
def _cycle(data, num, forward):
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
count = screen.clientCount()
|
||||
|
||||
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
|
||||
found = 2
|
||||
break
|
||||
elif screen.client(i).window() == client_win:
|
||||
found = 1
|
||||
if found == 1: # wraparound
|
||||
if forward: target = 0
|
||||
else: target = count - 1
|
||||
|
||||
t = target
|
||||
desktop = screen.desktop()
|
||||
while 1:
|
||||
client = screen.client(t)
|
||||
if client and focus._focusable(client, desktop) and client.focus():
|
||||
if raise_window:
|
||||
screen.raiseWindow(client)
|
||||
return
|
||||
if forward:
|
||||
t += num
|
||||
if t >= count: t -= count
|
||||
else:
|
||||
t -= num
|
||||
if t < 0: t += count
|
||||
if t == target: return # nothing to focus
|
||||
|
||||
print "Loaded focuscycle.py"
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
###########################################################################
|
||||
### Options that affect the behavior of the stackedcycle module. ###
|
||||
### Also see the options in the focus module. ###
|
||||
###########################################################################
|
||||
include_all_desktops = 0
|
||||
"""If this is non-zero then windows from all desktops will be included in
|
||||
|
@ -22,6 +21,8 @@ title_size_limit = 80
|
|||
activate_while_cycling = 1
|
||||
"""If this is non-zero then windows will be activated as they are
|
||||
highlighted in the cycling list (except iconified windows)."""
|
||||
# See focus.avoid_skip_taskbar
|
||||
# See focuscycle.raise_window
|
||||
###########################################################################
|
||||
|
||||
def next(data):
|
||||
|
@ -48,6 +49,7 @@ def previous(data):
|
|||
import otk
|
||||
import ob
|
||||
import focus
|
||||
import focuscycle
|
||||
|
||||
class cycledata:
|
||||
def __init__(self):
|
||||
|
@ -166,7 +168,7 @@ class cycledata:
|
|||
|
||||
# send a net_active_window message for the target
|
||||
if final or not client.iconic():
|
||||
if final: r = focus.raise_window
|
||||
if final: r = focuscycle.raise_window
|
||||
else: r = 0
|
||||
ob.send_client_msg(self.screeninfo.rootWindow(),
|
||||
otk.Property_atoms().openbox_active_window,
|
||||
|
@ -235,3 +237,5 @@ ob.ebind(ob.EventAction.NewWindow, _newwindow)
|
|||
ob.ebind(ob.EventAction.CloseWindow, _closewindow)
|
||||
|
||||
_o = cycledata()
|
||||
|
||||
print "Loaded stackedcycle.py"
|
||||
|
|
Loading…
Reference in a new issue