+ """Executes a command on the specified screen. It is recommended that you
+ use this call instead of a python system call. If the specified screen
+ is beyond your range of screens, the default is used instead."""
+ openbox.execute(screen, bin)
+
+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."""
+ mbind("Left", MC_Titlebar, MousePress, focus)
+ mbind("Left", MC_Handle, MousePress, focus)
+ mbind("Left", MC_Grip, MousePress, focus)
+ mbind("Left", MC_Window, MousePress, focus)
+ if click_raise:
+ mbind("Left", MC_Titlebar, MousePress, raise_win)
+ mbind("Left", MC_Handle, MousePress, raise_win)
+ mbind("Left", MC_Grip, MousePress, raise_win)
+ mbind("Left", MC_Window, MousePress, 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."""
+ ebind(EventEnterWindow, focus)
+ if click_focus:
+ setup_click_focus(click_raise)
+
+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
+ """
+ mbind("A-Left", MC_Frame, MouseMotion, move)
+ mbind("Left", MC_Titlebar, MouseMotion, move)
+ mbind("Left", MC_Handle, MouseMotion, move)
+
+ mbind("A-Right", MC_Frame, MouseMotion, resize)
+ mbind("Left", MC_Grip, MouseMotion, resize)
+
+ mbind("Left", MC_Titlebar, MousePress, raise_win)
+ mbind("Left", MC_Handle, MousePress, raise_win)
+ mbind("A-Left", MC_Frame, MousePress, raise_win)
+ mbind("A-Middle", MC_Frame, MouseClick, lower_win)
+ mbind("Middle", MC_Titlebar, MouseClick, lower_win)
+ mbind("Middle", MC_Handle, MouseClick, lower_win)
+
+ mbind("Left", MC_Titlebar, MouseDoubleClick, toggle_shade)
+
+def setup_window_buttons():
+ """Sets up the default behaviors for the buttons in the window titlebar."""
+ mbind("Left", MC_AllDesktopsButton, MouseClick, toggle_all_desktops)
+ mbind("Left", MC_CloseButton, MouseClick, close)
+
+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
+ """
+ mbind("Up", MC_Titlebar, MouseClick, shade)
+ mbind("Down", MC_Titlebar, MouseClick, unshade)
+
+ mbind("A-Up", MC_Frame, MouseClick, next_desktop)
+ mbind("A-Up", MC_Root, MouseClick, next_desktop)
+ mbind("A-Down", MC_Frame, MouseClick, prev_desktop)
+ mbind("A-Down", MC_Root, MouseClick, prev_desktop)
+
+ mbind("C-A-Up", MC_Frame, MouseClick, send_to_next_desktop)
+ mbind("C-A-Down", MC_Frame, MouseClick, send_to_prev_desktop)
+
+def setup_fallback_focus():
+ """Sets up a focus fallback routine so that when no windows are focused,
+ the last window to have focus on the desktop will be focused."""
+ global ob_focus_fallback # see focus.py
+ ob_focus_fallback = 1
+
+############################################################################
+### Window placement algorithms, choose one of these and ebind it to the ###
+### EventPlaceWindow action. ###
+############################################################################
+
+ob_rand = None
+import random
+def placewindows_random(data):
+ if not data.client: return
+ client_area = data.client.area()
+ frame_size = data.client.frame.size()
+ screen = display.screenInfo(data.screen)
+ width = screen.width() - (client_area.width() +
+ frame_size.left + frame_size.right)
+ height = screen.height() - (client_area.height() +
+ frame_size.top + frame_size.bottom)
+ global ob_rand
+ if not ob_rand: ob_rand = random.Random()
+ x = ob_rand.randrange(0, width-1)
+ y = ob_rand.randrange(0, height-1)
+ data.client.move(x, y)
+