]> Dogcows Code - chaz/openbox/commitdiff
new scripts for new script structure
authorDana Jansens <danakj@orodu.net>
Sun, 26 Jan 2003 03:45:24 +0000 (03:45 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 26 Jan 2003 03:45:24 +0000 (03:45 +0000)
scripts/behavior.py [new file with mode: 0644]
scripts/callbacks.py [new file with mode: 0644]
scripts/focusmodel.py [new file with mode: 0644]
scripts/windowplacement.py [new file with mode: 0644]

diff --git a/scripts/behavior.py b/scripts/behavior.py
new file mode 100644 (file)
index 0000000..3b407e1
--- /dev/null
@@ -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"
diff --git a/scripts/callbacks.py b/scripts/callbacks.py
new file mode 100644 (file)
index 0000000..caea758
--- /dev/null
@@ -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"
diff --git a/scripts/focusmodel.py b/scripts/focusmodel.py
new file mode 100644 (file)
index 0000000..a52fb39
--- /dev/null
@@ -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"
diff --git a/scripts/windowplacement.py b/scripts/windowplacement.py
new file mode 100644 (file)
index 0000000..127cd2a
--- /dev/null
@@ -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"
This page took 0.033804 seconds and 4 git commands to generate.