split out the linear cycling into focuscycle.py.

some better comments about what options can be used.
This commit is contained in:
Dana Jansens 2003-02-04 09:34:17 +00:00
parent 00978e674a
commit 8a05ae261d
4 changed files with 79 additions and 57 deletions

View file

@ -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:

View file

@ -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
View 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"

View file

@ -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"