Changeset 202
- Timestamp:
- 03/17/2008 11:50:41 AM (10 months ago)
- Location:
- trunk
- Files:
-
- 6 modified
-
examples/plpwm.py (modified) (5 diffs)
-
plwm/input.py (modified) (5 diffs)
-
plwm/menu.py (modified) (6 diffs)
-
plwm/message.py (modified) (5 diffs)
-
plwm/pane_utilities.py (modified) (15 diffs)
-
plwm/panes.py (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/examples/plpwm.py
r201 r202 87 87 88 88 class WMConfig: 89 def __wm_init__( my):89 def __wm_init__(self): 90 90 "install the panes key map, menus, and try to restore my config." 91 91 92 my.panekeys = PaneKeys(my)93 auto_restore( my, my.panekeys.menus.find('paneconfigmenus'))92 self.panekeys = PaneKeys(self) 93 auto_restore(self, self.panekeys.menus.find('paneconfigmenus')) 94 94 95 95 … … 105 105 panes_maxsize_gravity = X.NorthWestGravity 106 106 107 def __wm_screen_resize__( my):107 def __wm_screen_resize__(self): 108 108 "install the panes key map, menus, and try to restore my config." 109 109 110 auto_restore( my, my.panekeys.menus.find('paneconfigmenus'))110 auto_restore(self, self.panekeys.menus.find('paneconfigmenus')) 111 111 112 112 … … 127 127 menu_file = os.path.expanduser('~/.plpwmrc.xml') 128 128 129 def __init__( my, obj):130 keys.KeyHandler.__init__( my, obj)131 my.menus = load_menus(my.menu_file)129 def __init__(self, obj): 130 keys.KeyHandler.__init__(self, obj) 131 self.menus = load_menus(self.menu_file) 132 132 133 133 # Commands for navigating and manipulating panes 134 def C_0( my, event):134 def C_0(self, event): 135 135 "Go to the pane numbered by the keycode." 136 136 137 my.wm.panes_goto(my.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0)137 self.wm.panes_goto(self.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0) 138 138 139 139 C_1 = C_2 = C_3 = C_4 = C_5 = C_6 = C_7 = C_8 = C_9 = C_0 140 140 141 def M1_Tab( my, event): my.wm.panes_next()142 def S_M1_Tab( my, event): my.wm.panes_prev()143 144 def M1_0( my, event):145 pane = my.wm.panes_list[my.wm.panes_current]141 def M1_Tab(self, event): self.wm.panes_next() 142 def S_M1_Tab(self, event): self.wm.panes_prev() 143 144 def M1_0(self, event): 145 pane = self.wm.panes_list[self.wm.panes_current] 146 146 splitpane(pane, pane.horizontal_split, paneWindow) 147 147 148 def S_M1_0( my, event):149 pane = my.wm.panes_list[my.wm.panes_current]148 def S_M1_0(self, event): 149 pane = self.wm.panes_list[self.wm.panes_current] 150 150 splitpane(pane, pane.vertical_split, paneWindow) 151 151 152 def M1_1( my, event):153 my.wm.panes_list[my.wm.panes_current].maximize()154 155 def M1_2( my, event):156 split_pane( my.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0,157 my.wm.panes_list[my.wm.panes_current].horizontal_split)152 def M1_1(self, event): 153 self.wm.panes_list[self.wm.panes_current].maximize() 154 155 def M1_2(self, event): 156 split_pane(self.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0, 157 self.wm.panes_list[self.wm.panes_current].horizontal_split) 158 158 159 159 M1_3 = M1_4 = M1_5 = M1_6 = M1_7 = M1_8 = M1_9 = M1_2 160 160 161 def S_M1_2( my, event):162 split_pane( my.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0,163 my.wm.panes_list[my.wm.panes_current].vertical_split)161 def S_M1_2(self, event): 162 split_pane(self.wm.display.keycode_to_keysym(event.detail, 0) - XK.XK_0, 163 self.wm.panes_list[self.wm.panes_current].vertical_split) 164 164 165 165 S_M1_3 = S_M1_4 = S_M1_5 = S_M1_6 = S_M1_7 = S_M1_8 = S_M1_9 = S_M1_2 166 166 167 def M1_exclam( my, event):168 runcommand( my.wm.panes_list[my.wm.panes_current], paneWindow)169 170 def M1_equal( my, event):171 numberpane( my.wm.panes_list[my.wm.panes_current], paneWindow)172 173 def M1_minus( my, event):167 def M1_exclam(self, event): 168 runcommand(self.wm.panes_list[self.wm.panes_current], paneWindow) 169 170 def M1_equal(self, event): 171 numberpane(self.wm.panes_list[self.wm.panes_current], paneWindow) 172 173 def M1_minus(self, event): 174 174 """Close all the internal windows. Untested""" 175 175 176 for s in my.wm.screens:176 for s in self.wm.screens: 177 177 for w in s.windows: 178 if my.wm.is_internal_window(w):178 if self.wm.is_internal_window(w): 179 179 w.destroy() 180 180 181 def M1_quoteright( my, event):182 pullwindow( my.wm.panes_list[my.wm.panes_current], paneWindow)183 184 def M1_quotedbl( my, event):185 gotowindow( my.wm.panes_list[my.wm.panes_current], screenWindow)186 187 def M1_space( my, event):188 my.wm.panes_list[my.wm.panes_current].prev_window()189 190 def S_M1_space( my, event):191 my.wm.panes_list[my.wm.panes_current].next_window()192 193 def _getapp( my, node):194 getapp( my.wm.panes_list[my.wm.panes_current], node.get('title'),181 def M1_quoteright(self, event): 182 pullwindow(self.wm.panes_list[self.wm.panes_current], paneWindow) 183 184 def M1_quotedbl(self, event): 185 gotowindow(self.wm.panes_list[self.wm.panes_current], screenWindow) 186 187 def M1_space(self, event): 188 self.wm.panes_list[self.wm.panes_current].prev_window() 189 190 def S_M1_space(self, event): 191 self.wm.panes_list[self.wm.panes_current].next_window() 192 193 def _getapp(self, node): 194 getapp(self.wm.panes_list[self.wm.panes_current], node.get('title'), 195 195 node.get('command')) 196 196 197 def M1_a( my, event):198 view_menu( my.wm.panes_list[my.wm.panes_current],199 XML_controller( my.menus.find('functionmenu'),200 dict(getapp= my._getapp)))201 202 def M1_A( my, event):203 def run(node): my.wm.system('%s &' % node.get('command'))204 view_menu( my.wm.panes_list[my.wm.panes_current],205 XML_controller( my.menus.find('namemenu'),206 dict(getapp= my._getapp, run=run)))207 208 def M1_c( my, event):209 my.wm.panes_list[my.wm.panes_current].window.delete(1)210 211 def M1_l( my, event):212 my.wm.system('xscreensaver-command -activate')213 214 def M1_i( my, event):215 windowmenu( my.wm.panes_list[my.wm.panes_current], cfilter.iconified)216 217 def M1_I( my, event):218 my.wm.inspect_enable()219 my.wm.system('xterm -title Inspector -e inspect_plwm &')220 221 def M1_k( my, event):222 my.wm.panes_list[my.wm.panes_current].window.delete(1)223 224 def M1_K( my, event):225 my.wm.panes_list[my.wm.panes_current].window.destroy()226 227 def M1_m( my, event):197 def M1_a(self, event): 198 view_menu(self.wm.panes_list[self.wm.panes_current], 199 XML_controller(self.menus.find('functionmenu'), 200 dict(getapp=self._getapp))) 201 202 def M1_A(self, event): 203 def run(node): self.wm.system('%s &' % node.get('command')) 204 view_menu(self.wm.panes_list[self.wm.panes_current], 205 XML_controller(self.menus.find('namemenu'), 206 dict(getapp=self._getapp, run=run))) 207 208 def M1_c(self, event): 209 self.wm.panes_list[self.wm.panes_current].window.delete(1) 210 211 def M1_l(self, event): 212 self.wm.system('xscreensaver-command -activate') 213 214 def M1_i(self, event): 215 windowmenu(self.wm.panes_list[self.wm.panes_current], cfilter.iconified) 216 217 def M1_I(self, event): 218 self.wm.inspect_enable() 219 self.wm.system('xterm -title Inspector -e inspect_plwm &') 220 221 def M1_k(self, event): 222 self.wm.panes_list[self.wm.panes_current].window.delete(1) 223 224 def M1_K(self, event): 225 self.wm.panes_list[self.wm.panes_current].window.destroy() 226 227 def M1_m(self, event): 228 228 def itunes(node): os.system('itunes "%s" &' % node.get('command')) 229 view_menu( my.wm.panes_list[my.wm.panes_current],230 XML_controller( my.menus.find('itunesmenu'),229 view_menu(self.wm.panes_list[self.wm.panes_current], 230 XML_controller(self.menus.find('itunesmenu'), 231 231 dict(itunes=itunes))) 232 232 233 def M1_n( my, event):234 pane = my.wm.panes_list[my.wm.panes_current]233 def M1_n(self, event): 234 pane = self.wm.panes_list[self.wm.panes_current] 235 235 width, height = pane.screen.message_make("Current pane %d" % \ 236 my.wm.panes_current)236 self.wm.panes_current) 237 237 pane.screen.message_display((pane.width - width) / 2 + pane.x, 238 238 (pane.height - height) / 2 + pane.y) 239 239 240 def M1_p( my, event):241 panesmenu( my.wm.current_screen)242 243 def M1_r( my, event):244 my.wm.panes_list[my.wm.panes_current].force_window()245 246 def M1_R( my, event):240 def M1_p(self, event): 241 panesmenu(self.wm.current_screen) 242 243 def M1_r(self, event): 244 self.wm.panes_list[self.wm.panes_current].force_window() 245 246 def M1_R(self, event): 247 247 def reload_menus(): 248 my.menus = load_menus(my.menu_file)249 auto_restore( my.wm, my.menus.find('paneconfigmenus'))248 self.menus = load_menus(self.menu_file) 249 auto_restore(self.wm, self.menus.find('paneconfigmenus')) 250 250 251 251 def restore_menu(wm): 252 view_menu(pane, XML_controller( my.menus.find('paneconfigmenus'),252 view_menu(pane, XML_controller(self.menus.find('paneconfigmenus'), 253 253 dict(paneconfig=lambda x: restore(wm, x)))) 254 254 255 pane = my.wm.panes_list[my.wm.panes_current]256 codemenu(pane, {'1: Restore': (restore_menu, ( my.wm,)),255 pane = self.wm.panes_list[self.wm.panes_current] 256 codemenu(pane, {'1: Restore': (restore_menu, (self.wm,)), 257 257 '2: Reload': (reload_menus, ()), 258 258 '3: Restart': (os.execvp, (sys.executable, 259 259 [sys.executable] + sys.argv)), 260 '4: Quit': ( my.wm.quit, ())260 '4: Quit': (self.wm.quit, ()) 261 261 }) 262 262 263 def M1_s( my, event):263 def M1_s(self, event): 264 264 def dillo(url): 265 my.wm.system("dillo '%s' &" % url)265 self.wm.system("dillo '%s' &" % url) 266 266 267 267 def dowebsearch(node): … … 272 272 websearch(pane, node.get('label'), paneWindow, node.get('url')) 273 273 274 pane = my.wm.panes_list[my.wm.panes_current]275 menu = XML_controller( my.menus.find('websearches'), dict(search=dowebsearch))274 pane = self.wm.panes_list[self.wm.panes_current] 275 menu = XML_controller(self.menus.find('websearches'), dict(search=dowebsearch)) 276 276 add_keys(menu) 277 277 view_menu(pane, menu) 278 278 279 def M1_S( my, event):280 my.wm.panes_save()281 pane = my.wm.panes_list[my.wm.panes_current]279 def M1_S(self, event): 280 self.wm.panes_save() 281 pane = self.wm.panes_list[self.wm.panes_current] 282 282 width, height = pane.screen.message_make("Saved panes configuration") 283 283 pane.screen.message_display((pane.screen.root_width - width) … … 286 286 / 2 + pane.screen.root_y) 287 287 288 def M1_w( my, event):289 windowmenu( my.wm.panes_list[my.wm.panes_current])290 291 def M1_W( my, event):292 pane = my.wm.panes_list[my.wm.panes_current]288 def M1_w(self, event): 289 windowmenu(self.wm.panes_list[self.wm.panes_current]) 290 291 def M1_W(self, event): 292 pane = self.wm.panes_list[self.wm.panes_current] 293 293 windowmenu(pane, panes.panefilter(pane)) 294 294 295 def M1_x( my, event):296 my.wm.panes_list[my.wm.panes_current].iconify_window()295 def M1_x(self, event): 296 self.wm.panes_list[self.wm.panes_current].iconify_window() 297 297 298 298 -
trunk/plwm/input.py
r201 r202 54 54 timeout = None 55 55 56 def __init__( my, handler, display, history):56 def __init__(self, handler, display, history): 57 57 """Init with a handler and display. 58 58 … … 62 62 history is a list of strings we let the user scroll through.""" 63 63 64 KeyGrabKeyboard.__init__( my, handler, X.CurrentTime)65 my.display = display66 my.handler = handler67 my.history = history68 my.history_index = len(history)69 my.left = ""70 my.right = ""64 KeyGrabKeyboard.__init__(self, handler, X.CurrentTime) 65 self.display = display 66 self.handler = handler 67 self.history = history 68 self.history_index = len(history) 69 self.left = "" 70 self.right = "" 71 71 if isinstance(handler, Window): 72 my.selection = my.wm.display.intern_atom("SELECTION")73 my.wm.dispatch.add_handler(X.SelectionNotify,74 my._paste_selection, handlerid = my)75 display.show( my.left, my.right)76 77 def _paste_selection( my, event):72 self.selection = self.wm.display.intern_atom("SELECTION") 73 self.wm.dispatch.add_handler(X.SelectionNotify, 74 self._paste_selection, handlerid = self) 75 display.show(self.left, self.right) 76 77 def _paste_selection(self, event): 78 78 if event.property: 79 sel = my.handler.window.get_full_property(my.selection, Xatom.STRING)79 sel = self.handler.window.get_full_property(self.selection, Xatom.STRING) 80 80 if sel and sel.format == 8: 81 my.left = my.left + sel.value82 my.display.show(my.left, my.right)83 84 def _paste( my, event):85 if isinstance( my.handler, Window):86 my.handler.window.convert_selection(Xatom.PRIMARY, Xatom.STRING,87 my.selection, X.CurrentTime)88 89 def _insert( my, event):81 self.left = self.left + sel.value 82 self.display.show(self.left, self.right) 83 84 def _paste(self, event): 85 if isinstance(self.handler, Window): 86 self.handler.window.convert_selection(Xatom.PRIMARY, Xatom.STRING, 87 self.selection, X.CurrentTime) 88 89 def _insert(self, event): 90 90 if event.type != X.KeyPress: return 91 sym = my.wm.display.keycode_to_keysym(event.detail,91 sym = self.wm.display.keycode_to_keysym(event.detail, 92 92 event.state & X.ShiftMask != 0) 93 chr = my.wm.display.lookup_string(sym)94 if chr: my.left = my.left + chr95 my.display.show(my.left, my.right)96 97 def _forw( my, event):98 if my.right:99 my.left = my.left + my.right[0]100 my.right = my.right[1:]101 my.display.show(my.left, my.right)102 103 def _back( my, event):104 if my.left:105 my.right = my.left[-1] + my.right106 my.left = my.left[:-1]107 my.display.show(my.left, my.right)108 109 def _delforw( my, event):110 if my.right:111 my.right = my.right[1:]112 my.display.show(my.left, my.right)113 114 def _delback( my, event):115 if my.left:116 my.left = my.left[:-1]117 my.display.show(my.left, my.right)118 119 def _deltoend( my, event):120 my.right = ""121 my.display.show(my.left, my.right)122 123 def _end( my, event):124 my.left = my.left + my.right125 my.right = ""126 my.display.show(my.left, my.right)127 128 def _begin( my, event):129 my.right = my.left + my.right130 my.left = ""131 my.display.show(my.left, my.right)132 133 def _done( my, event):134 res = my.left + my.right135 my.history.append(res)136 my.display.do(res)137 my.wm.dispatch.remove_handler(my)138 my._cleanup()139 140 def _abort( my, event):141 my.display.abort()142 my.wm.dispatch.remove_handler(my)143 my._cleanup()144 145 def _history_up( my, event):146 if len( my.history):147 if my.history_index > 0:148 my.history_index -= 1149 my.left = my.history[my.history_index]150 my.right = ""151 my.display.show(my.left, my.right)152 153 def _history_down( my, event):154 if len( my.history):155 if my.history_index <(len(my.history)-1):156 my.history_index += 1157 my.left = my.history[my.history_index]158 my.right = ""159 my.display.show(my.left, my.right)93 chr = self.wm.display.lookup_string(sym) 94 if chr: self.left = self.left + chr 95 self.display.show(self.left, self.right) 96 97 def _forw(self, event): 98 if self.right: 99 self.left = self.left + self.right[0] 100 self.right = self.right[1:] 101 self.display.show(self.left, self.right) 102 103 def _back(self, event): 104 if self.left: 105 self.right = self.left[-1] + self.right 106 self.left = self.left[:-1] 107 self.display.show(self.left, self.right) 108 109 def _delforw(self, event): 110 if self.right: 111 self.right = self.right[1:] 112 self.display.show(self.left, self.right) 113 114 def _delback(self, event): 115 if self.left: 116 self.left = self.left[:-1] 117 self.display.show(self.left, self.right) 118 119 def _deltoend(self, event): 120 self.right = "" 121 self.display.show(self.left, self.right) 122 123 def _end(self, event): 124 self.left = self.left + self.right 125 self.right = "" 126 self.display.show(self.left, self.right) 127 128 def _begin(self, event): 129 self.right = self.left + self.right 130 self.left = "" 131 self.display.show(self.left, self.right) 132 133 def _done(self, event): 134 res = self.left + self.right 135 self.history.append(res) 136 self.display.do(res) 137 self.wm.dispatch.remove_handler(self) 138 self._cleanup() 139 140 def _abort(self, event): 141 self.display.abort() 142 self.wm.dispatch.remove_handler(self) 143 self._cleanup() 144 145 def _history_up(self, event): 146 if len(self.history): 147 if self.history_index > 0: 148 self.history_index -= 1 149 self.left = self.history[self.history_index] 150 self.right = "" 151 self.display.show(self.left, self.right) 152 153 def _history_down(self, event): 154 if len(self.history): 155 if self.history_index <(len(self.history)-1): 156 self.history_index += 1 157 self.left = self.history[self.history_index] 158 self.right = "" 159 self.display.show(self.left, self.right) 160 160 161 161 allmap(InputKeyHandler, InputKeyHandler._insert) … … 171 171 history = [] 172 172 173 def __init__( my, prompt, screen, length=30):173 def __init__(self, prompt, screen, length=30): 174 174 175 175 if not prompt: prompt = ' ' # We have problems if there's no prompt, so add one. 176 my.string = my.prompt = prompt177 my.offset = len(my.prompt)178 my.length = length + my.offset179 my.start = 0180 fg = screen.get_color( my.foreground)181 bg = screen.get_color( my.background)182 bc = screen.get_color( my.bordercolor)183 font = screen.wm.get_font( my.fontname, 'fixed')176 self.string = self.prompt = prompt 177 self.offset = len(self.prompt) 178 self.length = length + self.offset 179 self.start = 0 180 fg = screen.get_color(self.foreground) 181 bg = screen.get_color(self.background) 182 bc = screen.get_color(self.bordercolor) 183 font = screen.wm.get_font(self.fontname, 'fixed') 184 184 size = font.query() 185 my.height = size.font_ascent + size.font_descent + 1186 my.width = font.query_text_extents(prompt).overall_width + \185 self.height = size.font_ascent + size.font_descent + 1 186 self.width = font.query_text_extents(prompt).overall_width + \ 187 187 font.query_text_extents(length * 'm').overall_width 188 my.baseline = size.font_ascent + 1189 190 window = screen.root.create_window(0, 0, my.width, my.height,191 my.borderwidth,188 self.baseline = size.font_ascent + 1 189 190 window = screen.root.create_window(0, 0, self.width, self.height, 191 self.borderwidth, 192 192 X.CopyFromParent, X.InputOutput, 193 193 X.CopyFromParent, … … 197 197 X.ExposureMask)) 198 198 199 my.gc = window.create_gc(font = font, function = X.GXinvert,199 self.gc = window.create_gc(font = font, function = X.GXinvert, 200 200 foreground = fg, background = bg) 201 201 202 my.font = font203 my.window = screen.add_internal_window(window)204 my.window.dispatch.add_handler(X.VisibilityNotify, my.raisewindow)205 my.window.dispatch.add_handler(X.Expose, my.redraw)206 207 def read( my, action, handlertype, x=0, y=0):202 self.font = font 203 self.window = screen.add_internal_window(window) 204 self.window.dispatch.add_handler(X.VisibilityNotify, self.raisewindow) 205 self.window.dispatch.add_handler(X.Expose, self.redraw) 206 207 def read(self, action, handlertype, x=0, y=0): 208 208 "Open the window at x, y, using handlertype, and doing action." 209 209 210 my.action = action211 x, y, width, height = my.window.keep_on_screen(x, y, my.width, my.height)212 my.window.configure(x = x, y = y, width = width, height = height)213 my.window.map()214 my.window.get_focus(X.CurrentTime)215 handlertype( my.window, my, my.history)216 217 def raisewindow( my, event):218 my.window.raisewindow()219 220 def redraw( my, event = None):221 length = len( my.string)222 223 if my.offset < length:224 wide = my.font.query_text_extents(my.string[my.offset]).overall_width210 self.action = action 211 x, y, width, height = self.window.keep_on_screen(x, y, self.width, self.height) 212 self.window.configure(x = x, y = y, width = width, height = height) 213 self.window.map() 214 self.window.get_focus(X.CurrentTime) 215 handlertype(self.window, self, self.history) 216 217 def raisewindow(self, event): 218 self.window.raisewindow() 219 220 def redraw(self, event = None): 221 length = len(self.string) 222 223 if self.offset < length: 224 wide = self.font.query_text_extents(self.string[self.offset]).overall_width 225 225 else: 226 wide = my.font.query_text_extents(' ').overall_width227 228 if my.start >= my.offset: my.start = my.offset - 1229 left = my.font.query_text_extents(my.string[my.start:my.offset]).overall_width230 231 if left + wide >= my.width:232 my.start = my.offset - my.length + 1233 left = my.font.query_text_extents(my.string[my.start:my.offset]).overall_width234 235 my.window.clear_area(width = my.width, height = my.height)236 my.window.image_text(my.gc, 0, my.baseline, my.string[my.start:])237 my.window.fill_rectangle(my.gc, left, 0, wide, my.height)238 239 240 def show( my, left, right):226 wide = self.font.query_text_extents(' ').overall_width 227 228 if self.start >= self.offset: self.start = self.offset - 1 229 left = self.font.query_text_extents(self.string[self.start:self.offset]).overall_width 230 231 if left + wide >= self.width: 232 self.start = self.offset - self.length + 1 233 left = self.font.query_text_extents(self.string[self.start:self.offset]).overall_width 234 235 self.window.clear_area(width = self.width, height = self.height) 236 self.window.image_text(self.gc, 0, self.baseline, self.string[self.start:]) 237 self.window.fill_rectangle(self.gc, left, 0, wide, self.height) 238 239 240 def show(self, left, right): 241 241 if left: 242 my.string = my.prompt + left242 self.string = self.prompt + left 243 243 &
