new scripts for new script structure
This commit is contained in:
parent
be18a7c32e
commit
5168a8add5
4 changed files with 374 additions and 0 deletions
92
scripts/behavior.py
Normal file
92
scripts/behavior.py
Normal file
|
@ -0,0 +1,92 @@
|
|||
###############################################################################
|
||||
### Functions for setting up some default behaviors. This includes the ###
|
||||
### default bindings for clicking on various parts of a window, the ###
|
||||
### titlebar buttons, and bindings for the scroll wheel on your mouse. ###
|
||||
###############################################################################
|
||||
|
||||
import ob
|
||||
import callbacks
|
||||
|
||||
def setup_window_clicks():
|
||||
"""Sets up the default bindings for various mouse buttons for various
|
||||
contexts.
|
||||
This includes:
|
||||
* Alt-left drag anywhere on a window will move it
|
||||
* Alt-right drag anywhere on a window will resize it
|
||||
* Left drag on a window's titlebar/handle will move it
|
||||
* Left drag on a window's handle grips will resize it
|
||||
* Alt-left press anywhere on a window's will raise it to the front of
|
||||
its stacking layer.
|
||||
* Left press on a window's titlebar/handle will raise it to the front
|
||||
of its stacking layer.
|
||||
* Alt-middle click anywhere on a window's will lower it to the bottom
|
||||
of its stacking layer.
|
||||
* Middle click on a window's titlebar/handle will lower it to the
|
||||
bottom of its stacking layer.
|
||||
* Double-left click on a window's titlebar will toggle shading it
|
||||
"""
|
||||
ob.mbind("A-Left", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Motion, callbacks.move)
|
||||
ob.mbind("Left", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Motion, callbacks.move)
|
||||
ob.mbind("Left", ob.MouseContext.Handle,
|
||||
ob.MouseAction.Motion, callbacks.move)
|
||||
|
||||
ob.mbind("A-Right", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Motion, callbacks.resize)
|
||||
ob.mbind("Left", ob.MouseContext.Grip,
|
||||
ob.MouseAction.Motion, callbacks.resize)
|
||||
|
||||
ob.mbind("Left", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("Left", ob.MouseContext.Handle,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("A-Left", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("A-Middle", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Click, callbacks.lower_win)
|
||||
ob.mbind("Middle", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Click, callbacks.lower_win)
|
||||
ob.mbind("Middle", ob.MouseContext.Handle,
|
||||
ob.MouseAction.Click, callbacks.lower_win)
|
||||
|
||||
ob.mbind("Left", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.DoubleClick, callbacks.toggle_shade)
|
||||
|
||||
def setup_window_buttons():
|
||||
"""Sets up the default behaviors for the buttons in the window titlebar."""
|
||||
ob.mbind("Left", ob.MouseContext.AllDesktopsButton,
|
||||
ob.MouseAction.Click, callbacks.toggle_all_desktops)
|
||||
ob.mbind("Left", ob.MouseContext.CloseButton,
|
||||
ob.MouseAction.Click, callbacks.close)
|
||||
ob.mbind("Left", ob.MouseContext.IconifyButton,
|
||||
ob.MouseAction.Click, callbacks.iconify)
|
||||
|
||||
def setup_scroll():
|
||||
"""Sets up the default behaviors for the mouse scroll wheel.
|
||||
This includes:
|
||||
* scrolling on a window titlebar will shade/unshade it
|
||||
* alt-scrolling anywhere will switch to the next/previous desktop
|
||||
* control-alt-scrolling on a window will send it to the next/previous
|
||||
desktop, and switch to the desktop with the window
|
||||
"""
|
||||
ob.mbind("Up", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Click, callbacks.shade)
|
||||
ob.mbind("Down", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Click, callbacks.unshade)
|
||||
|
||||
ob.mbind("A-Up", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Click, callbacks.next_desktop)
|
||||
ob.mbind("A-Up", ob.MouseContext.Root,
|
||||
ob.MouseAction.Click, callbacks.next_desktop)
|
||||
ob.mbind("A-Down", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Click, callbacks.prev_desktop)
|
||||
ob.mbind("A-Down", ob.MouseContext.Root,
|
||||
ob.MouseAction.Click, callbacks.prev_desktop)
|
||||
|
||||
ob.mbind("C-A-Up", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Click, callbacks.send_to_next_desktop)
|
||||
ob.mbind("C-A-Down", ob.MouseContext.Frame,
|
||||
ob.MouseAction.Click, callbacks.send_to_prev_desktop)
|
||||
|
||||
print "Loaded behavior.py"
|
217
scripts/callbacks.py
Normal file
217
scripts/callbacks.py
Normal file
|
@ -0,0 +1,217 @@
|
|||
###########################################################################
|
||||
### Functions that can be used as callbacks for mouse/keyboard bindings ###
|
||||
###########################################################################
|
||||
|
||||
import ob
|
||||
|
||||
def state_above(data, add=2):
|
||||
"""Toggles, adds or removes the 'above' state on a window."""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().net_wm_state, data.client.window(),
|
||||
add, ob.Property_atoms().net_wm_state_above)
|
||||
|
||||
def state_below(data, add=2):
|
||||
"""Toggles, adds or removes the 'below' state on a window."""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().net_wm_state, data.client.window(),
|
||||
add, ob.Property_atoms().net_wm_state_below)
|
||||
|
||||
def state_shaded(data, add=2):
|
||||
"""Toggles, adds or removes the 'shaded' state on a window."""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().net_wm_state, data.client.window(),
|
||||
add, ob.Property_atoms().net_wm_state_shaded)
|
||||
|
||||
def iconify(data):
|
||||
"""Iconifies the window on which the event occured"""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().wm_change_state,
|
||||
data.client.window(), 3) # IconicState
|
||||
|
||||
def restore(data):
|
||||
"""Un-iconifies the window on which the event occured, but does not focus
|
||||
if. If you want to focus the window too, it is recommended that you
|
||||
use the activate() function."""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().wm_change_state,
|
||||
data.client.window(), 1) # NormalState
|
||||
|
||||
def close(data):
|
||||
"""Closes the window on which the event occured"""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().net_close_window,
|
||||
data.client.window(), 0)
|
||||
|
||||
def focus(data):
|
||||
"""Focuses the window on which the event occured"""
|
||||
if not data.client: return
|
||||
# !normal windows dont get focus from window enter events
|
||||
if data.action == ob.EventAction.EnterWindow and not data.client.normal():
|
||||
return
|
||||
data.client.focus()
|
||||
|
||||
def move(data):
|
||||
"""Moves the window interactively. This should only be used with
|
||||
MouseMotion events"""
|
||||
if not data.client: return
|
||||
|
||||
# not-normal windows dont get moved
|
||||
if not data.client.normal(): return
|
||||
|
||||
dx = data.xroot - data.pressx
|
||||
dy = data.yroot - data.pressy
|
||||
data.client.move(data.press_clientx + dx, data.press_clienty + dy)
|
||||
|
||||
def resize(data):
|
||||
"""Resizes the window interactively. This should only be used with
|
||||
MouseMotion events"""
|
||||
if not data.client: return
|
||||
|
||||
# not-normal windows dont get resized
|
||||
if not data.client.normal(): return
|
||||
|
||||
px = data.pressx
|
||||
py = data.pressy
|
||||
dx = data.xroot - px
|
||||
dy = data.yroot - py
|
||||
|
||||
# pick a corner to anchor
|
||||
if not (resize_nearest or data.context == MC_Grip):
|
||||
corner = Client.TopLeft
|
||||
else:
|
||||
x = px - data.press_clientx
|
||||
y = py - data.press_clienty
|
||||
if y < data.press_clientheight / 2:
|
||||
if x < data.press_clientwidth / 2:
|
||||
corner = Client.BottomRight
|
||||
dx *= -1
|
||||
else:
|
||||
corner = Client.BottomLeft
|
||||
dy *= -1
|
||||
else:
|
||||
if x < data.press_clientwidth / 2:
|
||||
corner = Client.TopRight
|
||||
dx *= -1
|
||||
else:
|
||||
corner = Client.TopLeft
|
||||
|
||||
data.client.resize(corner,
|
||||
data.press_clientwidth + dx,
|
||||
data.press_clientheight + dy);
|
||||
|
||||
def restart(data, other = ""):
|
||||
"""Restarts openbox, optionally starting another window manager."""
|
||||
ob.openbox.restart(other)
|
||||
|
||||
def raise_win(data):
|
||||
"""Raises the window on which the event occured"""
|
||||
if not data.client: return
|
||||
ob.openbox.screen(data.screen).raiseWindow(data.client)
|
||||
|
||||
def lower_win(data):
|
||||
"""Lowers the window on which the event occured"""
|
||||
if not data.client: return
|
||||
ob.openbox.screen(data.screen).lowerWindow(data.client)
|
||||
|
||||
def toggle_shade(data):
|
||||
"""Toggles the shade status of the window on which the event occured"""
|
||||
state_shaded(data)
|
||||
|
||||
def shade(data):
|
||||
"""Shades the window on which the event occured"""
|
||||
state_shaded(data, 1)
|
||||
|
||||
def unshade(data):
|
||||
"""Unshades the window on which the event occured"""
|
||||
state_shaded(data, 0)
|
||||
|
||||
def change_desktop(data, num):
|
||||
"""Switches to a specified desktop"""
|
||||
root = ob.display.screenInfo(data.screen).rootWindow()
|
||||
ob.send_client_msg(root, ob.Property_atoms().net_current_desktop,
|
||||
root, num)
|
||||
|
||||
def next_desktop(data, no_wrap=0):
|
||||
"""Switches to the next desktop, optionally (by default) cycling around to
|
||||
the first when going past the last."""
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d < (n-1)):
|
||||
d = d + 1
|
||||
elif not no_wrap:
|
||||
d = 0
|
||||
change_desktop(data, d)
|
||||
|
||||
def prev_desktop(data, no_wrap=0):
|
||||
"""Switches to the previous desktop, optionally (by default) cycling around
|
||||
to the last when going past the first."""
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d > 0):
|
||||
d = d - 1
|
||||
elif not no_wrap:
|
||||
d = n - 1
|
||||
change_desktop(data, d)
|
||||
|
||||
def send_to_desktop(data, num):
|
||||
"""Sends a client to a specified desktop"""
|
||||
if not data.client: return
|
||||
ob.send_client_msg(ob.display.screenInfo(data.screen).rootWindow(),
|
||||
ob.Property_atoms().net_wm_desktop,
|
||||
data.client.window(),num)
|
||||
|
||||
def toggle_all_desktops(data):
|
||||
"""Toggles between sending a client to all desktops and to the current
|
||||
desktop."""
|
||||
if not data.client: return
|
||||
if not data.client.desktop() == 0xffffffff:
|
||||
send_to_desktop(data, 0xffffffff)
|
||||
else:
|
||||
send_to_desktop(data, openbox.screen(data.screen).desktop())
|
||||
|
||||
def send_to_all_desktops(data):
|
||||
"""Sends a client to all desktops"""
|
||||
if not data.client: return
|
||||
send_to_desktop(data, 0xffffffff)
|
||||
|
||||
def send_to_next_desktop(data, no_wrap=0, follow=1):
|
||||
"""Sends a window to the next desktop, optionally (by default) cycling
|
||||
around to the first when going past the last. Also optionally moving to
|
||||
the new desktop after sending the window."""
|
||||
if not data.client: return
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d < (n-1)):
|
||||
d = d + 1
|
||||
elif not no_wrap:
|
||||
d = 0
|
||||
send_to_desktop(data, d)
|
||||
if follow:
|
||||
change_desktop(data, d)
|
||||
|
||||
def send_to_prev_desktop(data, no_wrap=0, follow=1):
|
||||
"""Sends a window to the previous desktop, optionally (by default) cycling
|
||||
around to the last when going past the first. Also optionally moving to
|
||||
the new desktop after sending the window."""
|
||||
if not data.client: return
|
||||
screen = ob.openbox.screen(data.screen)
|
||||
d = screen.desktop()
|
||||
n = screen.numDesktops()
|
||||
if (d > 0):
|
||||
d = d - 1
|
||||
elif not no_wrap:
|
||||
d = n - 1
|
||||
send_to_desktop(data, d)
|
||||
if follow:
|
||||
change_desktop(data, d)
|
||||
|
||||
print "Loaded callbacks.py"
|
40
scripts/focusmodel.py
Normal file
40
scripts/focusmodel.py
Normal file
|
@ -0,0 +1,40 @@
|
|||
###############################################################################
|
||||
### Functions for setting up some default focus models. ###
|
||||
###############################################################################
|
||||
|
||||
import ob
|
||||
import callbacks
|
||||
|
||||
def setup_click_focus(click_raise = 1):
|
||||
"""Sets up for focusing windows by clicking on or in the window.
|
||||
Optionally, clicking on or in a window can raise the window to the
|
||||
front of its stacking layer."""
|
||||
ob.mbind("Left", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Press, callbacks.focus)
|
||||
ob.mbind("Left", ob.MouseContext.Handle,
|
||||
ob.MouseAction.Press, callbacks.focus)
|
||||
ob.mbind("Left", ob.MouseContext.Grip,
|
||||
ob.MouseAction.Press, callbacks.focus)
|
||||
ob.mbind("Left", ob.MouseContext.Window,
|
||||
ob.MouseAction.Press, callbacks.focus)
|
||||
#ob.mbind("A-Left", ob.MouseContext.Frame, ob.MouseAction.Press, focus)
|
||||
if click_raise:
|
||||
ob.mbind("Left", ob.MouseContext.Titlebar,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("Left", ob.MouseContext.Handle,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("Left", ob.MouseContext.Grip,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
ob.mbind("Left", ob.MouseContext.Window,
|
||||
ob.MouseAction.Press, callbacks.raise_win)
|
||||
|
||||
def setup_sloppy_focus(click_focus = 1, click_raise = 0):
|
||||
"""Sets up for focusing windows when the mouse pointer enters them.
|
||||
Optionally, clicking on or in a window can focus it if your pointer
|
||||
ends up inside a window without focus. Also, optionally, clicking on or
|
||||
in a window can raise the window to the front of its stacking layer."""
|
||||
ob.ebind(ob.EventAction.EnterWindow, callbacks.focus)
|
||||
if click_focus:
|
||||
setup_click_focus(click_raise)
|
||||
|
||||
print "Loaded focusmodel.py"
|
25
scripts/windowplacement.py
Normal file
25
scripts/windowplacement.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
############################################################################
|
||||
### Window placement algorithms, choose one of these and ebind it to the ###
|
||||
### ob.EventAction.PlaceWindow event. ###
|
||||
############################################################################
|
||||
|
||||
import ob
|
||||
import random
|
||||
|
||||
_rand = random.Random()
|
||||
|
||||
def random(data):
|
||||
if not data.client: return
|
||||
client_area = data.client.area()
|
||||
frame_size = data.client.frame.size()
|
||||
screen_area = ob.openbox.screen(data.screen).area()
|
||||
width = screen_area.width() - (client_area.width() +
|
||||
frame_size.left + frame_size.right)
|
||||
height = screen_area.height() - (client_area.height() +
|
||||
frame_size.top + frame_size.bottom)
|
||||
global _rand
|
||||
x = _rand.randrange(screen_area.x(), width-1)
|
||||
y = _rand.randrange(screen_area.y(), height-1)
|
||||
data.client.move(x, y)
|
||||
|
||||
print "Loaded windowplacement.py"
|
Loading…
Reference in a new issue