state_above/below work now
[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 def state_above(data, add=2):
180     """Toggles, adds or removes the 'above' state on a window."""
181     client = Openbox_findClient(openbox, data.window())
182     if not client: return
183     root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
184     window = OBClient_window(client)
185     above = OBProperty_atom(Openbox_property(openbox),
186                             OBProperty_net_wm_state_above)
187     print above
188     send_client_msg(root, OBProperty_net_wm_state, window, add,
189                     above)
190     
191 def state_below(data, add=2):
192     """Toggles, adds or removes the 'below' state on a window."""
193     client = Openbox_findClient(openbox, data.window())
194     if not client: return
195     root = ScreenInfo_rootWindow(OBDisplay_screenInfo(data.screen()))
196     window = OBClient_window(client)
197     below = OBProperty_atom(Openbox_property(openbox),
198                             OBProperty_net_wm_state_below)
199     print below
200     send_client_msg(root, OBProperty_net_wm_state, window, add,
201                     below)
202     
203 #########################################
204 ### Convenience functions for scripts ###
205 #########################################
206
207 def execute(bin, screen = 0):
208     """Executes a command on the specified screen. It is recommended that you
209        use this call instead of a python system call. If the specified screen
210        is beyond your range of screens, the default is used instead."""
211     Openbox_execute(openbox, screen, bin)
212
213 print "Loaded builtins.py"