use client messages to switch desktops/move windows between desktops
[mikachu/openbox.git] / scripts / builtins.py
1 ###########################################################################
2 ### Functions that can be used as callbacks for mouse/keyboard bindings ###
3 ###########################################################################
4
5 def close(data):
6     """Closes the window on which the event occured"""
7     client = Openbox_findClient(openbox, data.window())
8     if client: OBClient_close(client)
9
10 def focus(data):
11     """Focuses the window on which the event occured"""
12     client = Openbox_findClient(openbox, data.window())
13     if not client: return
14     type = OBClient_type(client)
15     # !normal windows dont get focus from window enter events
16     if data.action() == EventEnterWindow and not OBClient_normal(client):
17         return
18     OBClient_focus(client)
19
20 def move(data):
21     """Moves the window interactively. This should only be used with
22        MouseMotion events"""
23     client = Openbox_findClient(openbox, data.window())
24     if not client: return
25
26     # !normal windows dont get moved
27     if not OBClient_normal(client): return
28
29     dx = data.xroot() - data.pressx()
30     dy = data.yroot() - data.pressy()
31     OBClient_move(client, data.press_clientx() + dx, data.press_clienty() + dy)
32
33 def resize(data):
34     """Resizes the window interactively. This should only be used with
35        MouseMotion events"""
36     client = Openbox_findClient(openbox, data.window())
37     if not client: return
38
39     # !normal windows dont get moved
40     if not OBClient_normal(client): return
41
42     px = data.pressx()
43     py = data.pressy()
44     dx = data.xroot() - px
45     dy = data.yroot() - py
46
47     # pick a corner to anchor
48     if not (resize_nearest or data.context() == MC_Grip):
49         corner = OBClient_TopLeft
50     else:
51         x = px - data.press_clientx()
52         y = py - data.press_clienty()
53         if y < data.press_clientheight() / 2:
54             if x < data.press_clientwidth() / 2:
55                 corner = OBClient_BottomRight
56                 dx *= -1
57             else:
58                 corner = OBClient_BottomLeft
59             dy *= -1
60         else:
61             if x < data.press_clientwidth() / 2:
62                 corner = OBClient_TopRight
63                 dx *= -1
64             else:
65                 corner = OBClient_TopLeft
66
67     OBClient_resize(client, corner,
68                     data.press_clientwidth() + dx,
69                     data.press_clientheight() + dy);
70
71 def restart(data):
72     """Restarts openbox"""
73     Openbox_restart(openbox, "")
74
75 def raise_win(data):
76     """Raises the window on which the event occured"""
77     client = Openbox_findClient(openbox, data.window())
78     if not client: return
79     screen = Openbox_screen(openbox, OBClient_screen(client))
80     OBScreen_restack(screen, 1, client)
81
82 def lower_win(data):
83     """Lowers the window on which the event occured"""
84     client = Openbox_findClient(openbox, data.window())
85     if not client: return
86     screen = Openbox_screen(openbox, OBClient_screen(client))
87     OBScreen_restack(screen, 0, client)
88
89 def toggle_shade(data):
90     """Toggles the shade status of the window on which the event occured"""
91     client = Openbox_findClient(openbox, data.window())
92     if not client: return
93     print "toggle_shade"
94     OBClient_shade(client, not OBClient_shaded(client))
95
96 def shade(data):
97     """Shades the window on which the event occured"""
98     client = Openbox_findClient(openbox, data.window())
99     if not client: return
100     OBClient_shade(client, 1)
101
102 def unshade(data):
103     """Unshades the window on which the event occured"""
104     client = Openbox_findClient(openbox, data.window())
105     if not client: return
106     OBClient_shade(client, 0)
107
108 def change_desktop(data, num):
109     """Switches to a specified desktop"""
110     root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
111     send_client_msg(root, OBProperty_net_current_desktop, root, num)
112
113 def next_desktop(data, no_wrap=0):
114     """Switches to the next desktop, optionally (by default) cycling around to
115        the first when going past the last."""
116     screen = Openbox_screen(openbox, data.screen())
117     d = OBScreen_desktop(screen)
118     n = OBScreen_numDesktops(screen)
119     if (d < (n-1)):
120         d = d + 1
121     elif not no_wrap:
122         d = 0
123     change_desktop(data, d)
124     
125 def prev_desktop(data, no_wrap=0):
126     """Switches to the previous desktop, optionally (by default) cycling around
127        to the last when going past the first."""
128     screen = Openbox_screen(openbox, data.screen())
129     d = OBScreen_desktop(screen)
130     n = OBScreen_numDesktops(screen)
131     if (d > 0):
132         d = d - 1
133     elif not no_wrap:
134         d = n - 1
135     change_desktop(data, d)
136
137 def send_to_desktop(data, num):
138     """Sends a client to a specified desktop"""
139     root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
140     client = Openbox_findClient(openbox, data.window())
141     if client:
142         window = OBClient_window(client)
143         send_client_msg(root, OBProperty_net_wm_desktop, window, num)
144
145 def send_to_next_desktop(data, no_wrap=0, follow=1):
146     """Sends a window to the next desktop, optionally (by default) cycling
147        around to the first when going past the last. Also optionally moving to
148        the new desktop after sending the window."""
149     client = Openbox_findClient(openbox, data.window())
150     if not client: return
151     screen = Openbox_screen(openbox, data.screen())
152     d = OBScreen_desktop(screen)
153     n = OBScreen_numDesktops(screen)
154     if (d < (n-1)):
155         d = d + 1
156     elif not no_wrap:
157         d = 0
158     send_to_desktop(data, d)
159     if follow:
160         change_desktop(data, d)
161     
162 def send_to_prev_desktop(data, no_wrap=0, follow=1):
163     """Sends a window to the previous desktop, optionally (by default) cycling
164        around to the last when going past the first. Also optionally moving to
165        the new desktop after sending the window."""
166     client = Openbox_findClient(openbox, data.window())
167     if not client: return
168     screen = Openbox_screen(openbox, data.screen())
169     d = OBScreen_desktop(screen)
170     n = OBScreen_numDesktops(screen)
171     if (d > 0):
172         d = d - 1
173     elif not no_wrap:
174         d = n - 1
175     send_to_desktop(data, d)
176     if follow:
177         change_desktop(data, d)
178     
179 #########################################
180 ### Convenience functions for scripts ###
181 #########################################
182
183 def execute(bin, screen = 0):
184     """Executes a command on the specified screen. It is recommended that you
185        use this call instead of a python system call. If the specified screen
186        is beyond your range of screens, the default is used instead."""
187     Openbox_execute(openbox, screen, bin)
188
189 print "Loaded builtins.py"