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
|
MAINTAINERCLEANFILES = Makefile.in
|
||||||
script_DATA = config.py defaults.py focus.py callbacks.py \
|
script_DATA = config.py defaults.py focus.py callbacks.py \
|
||||||
focusmodel.py windowplacement.py behavior.py motion.py \
|
focusmodel.py windowplacement.py behavior.py motion.py \
|
||||||
historyplacement.py stackedcycle.py
|
historyplacement.py stackedcycle.py focuscycle.py
|
||||||
EXTRA_DIST = $(script_DATA)
|
EXTRA_DIST = $(script_DATA)
|
||||||
|
|
||||||
distclean-local:
|
distclean-local:
|
||||||
|
|
|
@ -9,21 +9,10 @@ avoid_skip_taskbar = 1
|
||||||
"""Don't focus windows which have requested to not be displayed in taskbars.
|
"""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
|
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."""
|
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
|
fallback = 0
|
||||||
"""Send focus somewhere when nothing is left with the focus, if possible."""
|
"""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. ###
|
### Internal stuff, should not be accessed outside the module. ###
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
import otk
|
|
||||||
import ob
|
import ob
|
||||||
|
|
||||||
# maintain a list of clients, stacked in focus order
|
# 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.CloseWindow, _closewindow)
|
||||||
ob.ebind(ob.EventAction.Focus, _focused)
|
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"
|
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. ###
|
### Options that affect the behavior of the stackedcycle module. ###
|
||||||
### Also see the options in the focus module. ###
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
include_all_desktops = 0
|
include_all_desktops = 0
|
||||||
"""If this is non-zero then windows from all desktops will be included in
|
"""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
|
activate_while_cycling = 1
|
||||||
"""If this is non-zero then windows will be activated as they are
|
"""If this is non-zero then windows will be activated as they are
|
||||||
highlighted in the cycling list (except iconified windows)."""
|
highlighted in the cycling list (except iconified windows)."""
|
||||||
|
# See focus.avoid_skip_taskbar
|
||||||
|
# See focuscycle.raise_window
|
||||||
###########################################################################
|
###########################################################################
|
||||||
|
|
||||||
def next(data):
|
def next(data):
|
||||||
|
@ -48,6 +49,7 @@ def previous(data):
|
||||||
import otk
|
import otk
|
||||||
import ob
|
import ob
|
||||||
import focus
|
import focus
|
||||||
|
import focuscycle
|
||||||
|
|
||||||
class cycledata:
|
class cycledata:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -166,7 +168,7 @@ class cycledata:
|
||||||
|
|
||||||
# send a net_active_window message for the target
|
# send a net_active_window message for the target
|
||||||
if final or not client.iconic():
|
if final or not client.iconic():
|
||||||
if final: r = focus.raise_window
|
if final: r = focuscycle.raise_window
|
||||||
else: r = 0
|
else: r = 0
|
||||||
ob.send_client_msg(self.screeninfo.rootWindow(),
|
ob.send_client_msg(self.screeninfo.rootWindow(),
|
||||||
otk.Property_atoms().openbox_active_window,
|
otk.Property_atoms().openbox_active_window,
|
||||||
|
@ -235,3 +237,5 @@ ob.ebind(ob.EventAction.NewWindow, _newwindow)
|
||||||
ob.ebind(ob.EventAction.CloseWindow, _closewindow)
|
ob.ebind(ob.EventAction.CloseWindow, _closewindow)
|
||||||
|
|
||||||
_o = cycledata()
|
_o = cycledata()
|
||||||
|
|
||||||
|
print "Loaded stackedcycle.py"
|
||||||
|
|
Loading…
Reference in a new issue