]> Dogcows Code - chaz/openbox/blobdiff - scripts/builtins.py
pass the right num of shit to the client msg
[chaz/openbox] / scripts / builtins.py
index eaeaca22b4dcb3afdf9298d2cde580457da0ef55..027ccabb0d4664ae02fb42bf8cb400f51c06d1e9 100644 (file)
@@ -2,22 +2,55 @@
 ### Functions that can be used as callbacks for mouse/keyboard bindings ###
 ###########################################################################
 
+def state_above(data, add=2):
+    """Toggles, adds or removes the 'above' state on a window."""
+    client = Openbox_findClient(openbox, data.window())
+    if not client: return
+    root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    window = OBClient_window(client)
+    above = OBProperty_atom(Openbox_property(openbox),
+                            OBProperty_net_wm_state_above)
+    send_client_msg(root, OBProperty_net_wm_state, window, add,
+                    above)
+    
+def state_below(data, add=2):
+    """Toggles, adds or removes the 'below' state on a window."""
+    client = Openbox_findClient(openbox, data.window())
+    if not client: return
+    root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    window = OBClient_window(client)
+    below = OBProperty_atom(Openbox_property(openbox),
+                            OBProperty_net_wm_state_below)
+    send_client_msg(root, OBProperty_net_wm_state, window, add,
+                    below)
+    
+def state_shaded(data, add=2):
+    """Toggles, adds or removes the 'shaded' state on a window."""
+    client = Openbox_findClient(openbox, data.window())
+    if not client: return
+    root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    window = OBClient_window(client)
+    shaded = OBProperty_atom(Openbox_property(openbox),
+                            OBProperty_net_wm_state_shaded)
+    send_client_msg(root, OBProperty_net_wm_state, window, add,
+                    shaded)
+    
 def close(data):
     """Closes the window on which the event occured"""
     client = Openbox_findClient(openbox, data.window())
-    if client: OBClient_close(client)
+    if not client: return
+    root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    window = OBClient_window(client)
+    send_client_msg(root, OBProperty_net_close_window, window, 0)
 
 def focus(data):
     """Focuses the window on which the event occured"""
     client = Openbox_findClient(openbox, data.window())
     if not client: return
     type = OBClient_type(client)
-    # these types of windows dont get focus from window enter events
-    if data.action() == EventEnterWindow:
-        print "enter window"
-        if (type == OBClient_Type_Dock or \
-            type == OBClient_Type_Desktop):
-            return
+    # !normal windows dont get focus from window enter events
+    if data.action() == EventEnterWindow and not OBClient_normal(client):
+        return
     OBClient_focus(client)
 
 def move(data):
@@ -26,6 +59,9 @@ def move(data):
     client = Openbox_findClient(openbox, data.window())
     if not client: return
 
+    # !normal windows dont get moved
+    if not OBClient_normal(client): return
+
     dx = data.xroot() - data.pressx()
     dy = data.yroot() - data.pressy()
     OBClient_move(client, data.press_clientx() + dx, data.press_clienty() + dy)
@@ -36,6 +72,9 @@ def resize(data):
     client = Openbox_findClient(openbox, data.window())
     if not client: return
 
+    # !normal windows dont get moved
+    if not OBClient_normal(client): return
+
     px = data.pressx()
     py = data.pressy()
     dx = data.xroot() - px
@@ -66,44 +105,114 @@ def resize(data):
                     data.press_clientheight() + dy);
 
 def restart(data):
+    """Restarts openbox"""
     Openbox_restart(openbox, "")
 
-def toggle_shade(data):
-    print "toggle_shade"
-
 def raise_win(data):
+    """Raises the window on which the event occured"""
     client = Openbox_findClient(openbox, data.window())
     if not client: return
     screen = Openbox_screen(openbox, OBClient_screen(client))
     OBScreen_restack(screen, 1, client)
 
 def lower_win(data):
+    """Lowers the window on which the event occured"""
     client = Openbox_findClient(openbox, data.window())
     if not client: return
     screen = Openbox_screen(openbox, OBClient_screen(client))
     OBScreen_restack(screen, 0, client)
 
 def toggle_shade(data):
-    client = Openbox_findClient(openbox, data.window())
-    if not client: return
-    print "toggle_shade"
-    OBClient_shade(client, not OBClient_shaded(client))
+    """Toggles the shade status of the window on which the event occured"""
+    state_shaded(data)
 
 def shade(data):
-    client = Openbox_findClient(openbox, data.window())
-    if not client: return
-    OBClient_shade(client, 1)
+    """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 = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    send_client_msg(root, OBProperty_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 = Openbox_screen(openbox, data.screen())
+    d = OBScreen_desktop(screen)
+    n = OBScreen_numDesktops(screen)
+    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 = Openbox_screen(openbox, data.screen())
+    d = OBScreen_desktop(screen)
+    n = OBScreen_numDesktops(screen)
+    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"""
+    root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
+    client = Openbox_findClient(openbox, data.window())
+    if client:
+        window = OBClient_window(client)
+        send_client_msg(root, OBProperty_net_wm_desktop, window, num)
+
+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."""
     client = Openbox_findClient(openbox, data.window())
     if not client: return
-    OBClient_shade(client, 0)
+    screen = Openbox_screen(openbox, data.screen())
+    d = OBScreen_desktop(screen)
+    n = OBScreen_numDesktops(screen)
+    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."""
+    client = Openbox_findClient(openbox, data.window())
+    if not client: return
+    screen = Openbox_screen(openbox, data.screen())
+    d = OBScreen_desktop(screen)
+    n = OBScreen_numDesktops(screen)
+    if (d > 0):
+        d = d - 1
+    elif not no_wrap:
+        d = n - 1
+    send_to_desktop(data, d)
+    if follow:
+        change_desktop(data, d)
+
 #########################################
 ### Convenience functions for scripts ###
 #########################################
 
 def execute(bin, screen = 0):
+    """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(openbox, screen, bin)
 
 print "Loaded builtins.py"
This page took 0.029801 seconds and 4 git commands to generate.