From 9bc4f662d0c067ac59f05f2b9c625017b07a79fa Mon Sep 17 00:00:00 2001 From: olpc Date: Thu, 11 Dec 2008 22:10:33 +0000 Subject: Optimizations, bug fixes, etc. --- diff --git a/MANIFEST b/MANIFEST index 4c40627..1df0f6a 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,11 +1,11 @@ COPYING NEWS TODO -xorg-dcon.conf colors.py colorsc.py _colorsc.so setup.py +setupwacom.sh src/build.sh src/deploy.sh src/gtk_types.h diff --git a/colors.py b/colors.py index 5436936..dc0a829 100755 --- a/colors.py +++ b/colors.py @@ -86,12 +86,12 @@ class BrushControlsPanel(gtk.HBox): def __init__ (self): gtk.HBox.__init__(self) - self.set_property("spacing", 20) + self.set_property("spacing", 10) self.set_border_width(50) - + # Locally managed Brush object. self.brush = Brush() - + # Palette wheel widget. palbox = gtk.VBox() self.palette = Palette(BrushControlsPanel.PALETTE_SIZE) @@ -106,11 +106,10 @@ class BrushControlsPanel(gtk.HBox): self.palettearea.connect('button-press-event', self.on_palette_mouse) self.palettearea.connect('button-release-event', self.on_palette_mouse) palbox.pack_start(self.palettearea, False, False) - self.pack_start(palbox, False) - + # Brush size scrollbar, label and pressure sensitivity checkbox. sizebox = gtk.VBox() - sizelabel = gtk.Label(_('Brush Size')) + sizelabel = gtk.Label(_('Size')) sizebox.pack_end(sizelabel, False) self.size = gtk.Adjustment(50, 1, 130, 1, 10, 10) self.sizebar = gtk.VScale(self.size) @@ -121,11 +120,10 @@ class BrushControlsPanel(gtk.HBox): self.sizecheck = gtk.CheckButton(_('Sensitive')) self.sizecheck.connect('toggled', self.on_variable_size_toggle) sizebox.pack_end(self.sizecheck, False) - self.pack_start(sizebox, False) - + # Brush opacity scrollbar, label and pressure sensitivity checkbox. opacitybox = gtk.VBox() - opacitylabel = gtk.Label(_('Brush Opacity')) + opacitylabel = gtk.Label(_('Opacity')) opacitybox.pack_end(opacitylabel, False) self.opacity = gtk.Adjustment(0, 0, 1.1, 0.001, 0.1, 0.1) self.opacitybar = gtk.VScale(self.opacity) @@ -136,35 +134,37 @@ class BrushControlsPanel(gtk.HBox): self.opacitycheck = gtk.CheckButton(_('Sensitive')) self.opacitycheck.connect('toggled', self.on_variable_opacity_toggle) opacitybox.pack_end(self.opacitycheck, False) - self.pack_start(opacitybox, False) - + # Force column scrollbars to be equal width. group = gtk.SizeGroup(gtk.SIZE_GROUP_HORIZONTAL) group.add_widget(sizebox) group.add_widget(opacitybox) - + # Brush preview widget. brushbox = gtk.VBox() brushbox.set_property("spacing", 20) - + self.preview = BrushPreview(BrushControlsPanel.PREVIEW_SIZE) self.previewimage = gtk.gdk.Image(gtk.gdk.IMAGE_FASTEST, gtk.gdk.visual_get_system(), BrushControlsPanel.PREVIEW_SIZE, BrushControlsPanel.PREVIEW_SIZE) self.previewarea = gtk.DrawingArea() self.previewarea.set_size_request(BrushControlsPanel.PREVIEW_SIZE, BrushControlsPanel.PREVIEW_SIZE) self.previewarea.connect('expose-event', self.on_preview_expose) brushbox.pack_start(self.previewarea, False) - + # Brush type selection widgets. self.brushbtns = [] brushtbl = gtk.Table(1, 2) brushtbl.set_col_spacings(5) brushtbl.attach(self.create_brushtype_widget(BrushType.BRUSHTYPE_SOFT), 0, 1, 0, 1) brushtbl.attach(self.create_brushtype_widget(BrushType.BRUSHTYPE_HARD), 1, 2, 0, 1) - + brushbox.pack_start(brushtbl, False) - + + self.pack_start(sizebox, True, False) + self.pack_start(opacitybox, True, False) + self.pack_start(palbox, True, False) self.pack_start(brushbox, False) - + self.in_toggle_cb = False def create_brushtype_widget (self, type): @@ -304,9 +304,10 @@ class Colors(activity.Activity, ExportedGObject): MODE_INTRO = 0 MODE_PLAYBACK = 1 MODE_CANVAS = 2 - MODE_SCROLL = 3 - MODE_PALETTE = 4 - MODE_REFERENCE = 5 + MODE_PICK = 3 + MODE_SCROLL = 4 + MODE_PALETTE = 5 + MODE_REFERENCE = 6 # Button definitions BUTTON_PALETTE = 1<<0 @@ -316,12 +317,9 @@ class Colors(activity.Activity, ExportedGObject): BUTTON_PICK = 1<<4 BUTTON_ZOOM_IN = 1<<5 BUTTON_ZOOM_OUT = 1<<6 - BUTTON_SIZE_0 = 1<<7 - BUTTON_SIZE_1 = 1<<8 - BUTTON_SIZE_2 = 1<<9 - BUTTON_SIZE_3 = 1<<10 - BUTTON_TOUCH = 1<<11 - BUTTON_CONTROL = 1<<12 + BUTTON_CENTER = 1<<7 + BUTTON_TOUCH = 1<<8 + BUTTON_CONTROL = 1<<9 # Number of drawing steps to execute between progress bar updates. More updates means faster overall drawing # but a less responsive UI. @@ -411,12 +409,12 @@ class Colors(activity.Activity, ExportedGObject): self.easelimage = gtk.gdk.Image(gtk.gdk.IMAGE_FASTEST, gtk.gdk.visual_get_system(), self.width, self.height) # Now that we have a canvas, connect the rest of the events. - self.easelarea.connect('expose-event', self.on_canvasarea_expose) + self.easelarea.connect('expose-event', self.on_easelarea_expose) self.connect('key-press-event', self.on_key_event) self.connect('key-release-event', self.on_key_event) - self.easelarea.connect('button-press-event', self.on_mouse_button) - self.easelarea.connect('button-release-event', self.on_mouse_button) - self.easelarea.connect('motion-notify-event', self.on_mouse_motion) + self.easelarea.connect('button-press-event', self.on_mouse_event) + self.easelarea.connect('button-release-event', self.on_mouse_event) + self.easelarea.connect('motion-notify-event', self.on_mouse_event) def build_brush_controls (self): self.brush_controls = BrushControlsPanel() @@ -429,6 +427,8 @@ class Colors(activity.Activity, ExportedGObject): self.easelarea.put(self.progress, 0, 0) def build_toolbar (self): + self.add_accel_group(gtk.AccelGroup()) + # Painting controls (palette, zoom, etc) self.palettebtn = toggletoolbutton.ToggleToolButton('palette') self.palettebtn.set_tooltip(_("Palette")) @@ -445,23 +445,36 @@ class Colors(activity.Activity, ExportedGObject): # todo- Color picker button, similar semantics to scroll button. self.zoomsep = gtk.SeparatorToolItem() + self.zoomsep.set_expand(True) + self.zoomsep.set_draw(False) self.zoomoutbtn = toolbutton.ToolButton('zoom-out') self.zoomoutbtn.set_tooltip(_("Zoom Out")) self.zoomoutbtn.connect('clicked', self.on_zoom_out) + self.zoomoutbtn.props.accelerator = 'X' self.zoominbtn = toolbutton.ToolButton('zoom-in') self.zoominbtn.set_tooltip(_("Zoom In")) + self.zoominbtn.props.accelerator = 'Z' self.zoominbtn.connect('clicked', self.on_zoom_in) self.centerbtn = toolbutton.ToolButton('zoom-original') self.centerbtn.set_tooltip(_("Center Image")) self.centerbtn.connect('clicked', self.on_center) + self.centerbtn.props.accelerator = 'A' - self.editsep = gtk.SeparatorToolItem() + self.fullscreenbtn = toolbutton.ToolButton('view-fullscreen') + self.fullscreenbtn.set_tooltip(_("Fullscreen")) + self.fullscreenbtn.connect('clicked', self.on_fullscreen) + self.fullscreenbtn.props.accelerator = 'Enter' + self.editsep = gtk.SeparatorToolItem() + self.editsep.set_expand(True) + self.editsep.set_draw(False) + self.copybtn = toolbutton.ToolButton('edit-copy') self.copybtn.set_tooltip(_("Copy")) self.copybtn.connect('clicked', self.on_copy) - + self.copybtn.props.accelerator = 'C' + #self.refsep = gtk.SeparatorToolItem() # #self.takerefbtn = toolbutton.ToolButton('take-reference') @@ -490,13 +503,10 @@ class Colors(activity.Activity, ExportedGObject): self.clearsep.set_expand(True) self.clearsep.set_draw(False) - self.fullscreenbtn = toolbutton.ToolButton('view-fullscreen') - self.fullscreenbtn.set_tooltip(_("Fullscreen")) - self.fullscreenbtn.connect('clicked', self.on_fullscreen) - self.clearbtn = toolbutton.ToolButton('erase') - self.clearbtn.set_tooltip(_("Start Over")) + self.clearbtn.set_tooltip(_("Erase Image")) self.clearbtn.connect('clicked', self.on_clear) + self.clearbtn.props.accelerator = 'E' #editbox = activity.EditToolbar() #editbox.undo.props.visible = False @@ -512,6 +522,7 @@ class Colors(activity.Activity, ExportedGObject): paintbox.insert(self.zoomoutbtn, -1) paintbox.insert(self.zoominbtn, -1) paintbox.insert(self.centerbtn, -1) + paintbox.insert(self.fullscreenbtn, -1) paintbox.insert(self.editsep, -1) paintbox.insert(self.copybtn, -1) #paintbox.insert(self.refsep, -1) @@ -521,7 +532,6 @@ class Colors(activity.Activity, ExportedGObject): #paintbox.insert(self.videopaintbtn, -1) #paintbox.insert(self.videopaintitem, -1) paintbox.insert(self.clearsep, -1) - paintbox.insert(self.fullscreenbtn, -1) paintbox.insert(self.clearbtn, -1) # Playback controls @@ -879,7 +889,7 @@ class Colors(activity.Activity, ExportedGObject): # So each major key should appear at least once on each side of the keyboard. button = 0 - if key_name == 'Alt_L' or key_name == 'ISO_Level3_Shift': + if key_name == 'Shift_L' or key_name == 'Shift_R': button = Colors.BUTTON_CONTROL # Space bar for Palette (todo- need something better!). @@ -899,7 +909,7 @@ class Colors(activity.Activity, ExportedGObject): # self.save_thumbnail(activity.get_bundle_path() + '/thumb.png') # OLPC 'hand' buttons for scrolling. - elif event.keyval == ord('c') or event.hardware_keycode == 133 or event.hardware_keycode == 134: + elif event.hardware_keycode == 133 or event.hardware_keycode == 134: button = Colors.BUTTON_SCROLL # OLPC 'size' buttons for intensity. @@ -908,11 +918,13 @@ class Colors(activity.Activity, ExportedGObject): #elif event.keyval == 288: button = Colors.BUTTON_SIZE_2 #elif event.keyval == 289: button = Colors.BUTTON_SIZE_3 - # Arrow keys, gamepad 'face' buttons, or 'z' and 'x' for Zoom. - elif event.keyval == ord('z') or key_name == 'Up': + # Arrow keys, gamepad 'face' buttons for zooming and centering. + elif key_name == 'Up': button = Colors.BUTTON_ZOOM_IN - elif event.keyval == ord('x') or key_name == 'Down': + elif key_name == 'Down': button = Colors.BUTTON_ZOOM_OUT + elif key_name == 'Right' or key_name == 'Left': + button = Colors.BUTTON_CENTER # Either Alt key for pick. elif key_name == 'Alt_L' or key_name == 'ISO_Level3_Shift': @@ -930,65 +942,53 @@ class Colors(activity.Activity, ExportedGObject): else: # Not a known key. Try to store / retrieve a brush. + key = unichr(event.keyval).lower() if self.cur_buttons & Colors.BUTTON_CONTROL: - self.brush_map[event.keyval] = Brush(self.easel.brush) + self.brush_map[key] = Brush(self.easel.brush) else: - if self.brush_map.has_key(event.keyval): - self.set_brush(self.brush_map[event.keyval]) - + if self.brush_map.has_key(key): + self.set_brush(self.brush_map[key]) + return False - def on_mouse_button(self, widget, event): + def on_mouse_event (self, widget, event): if self.overlay_active: return - - if event.button == 1: - if event.type == gtk.gdk.BUTTON_PRESS: + + if event.type == gtk.gdk.BUTTON_PRESS: + if event.button == 1: self.pending_press = self.pending_press | Colors.BUTTON_TOUCH - if event.type == gtk.gdk.BUTTON_RELEASE: + if event.type == gtk.gdk.BUTTON_RELEASE: + if event.button == 1: self.pending_release = self.pending_release | Colors.BUTTON_TOUCH - #else: - # if event.type == gtk.gdk.BUTTON_PRESS: - # self.pending_press = self.pending_press | Colors.BUTTON_PALETTE - # if event.type == gtk.gdk.BUTTON_RELEASE: - # self.pending_release = self.pending_release | Colors.BUTTON_PALETTE - - if not widget.is_focus(): - widget.grab_focus() - self.update() - - return True - - def on_mouse_motion (self, widget, event): - if self.overlay_active: - return - - state = event.device.get_state(self.easelarea.window)[0] - pressure = event.device.get_axis(state, gtk.gdk.AXIS_PRESSURE) - try: + x, y = event.get_coords() + state = event.get_state() + + # Read pressure information if available. + pressure = event.get_axis(gtk.gdk.AXIS_PRESSURE) + if pressure: self.pressure = int(pressure * 255) - except: + else: self.pressure = 255 + + # When 0 pressure is received, simulate a button release. + if self.pressure <= 0: + self.pending_release = self.pending_release | Colors.BUTTON_TOUCH - # Process mouse event normally. - if event.is_hint: - x, y, state = event.window.get_pointer() - else: - x = event.x - y = event.y - state = event.state self.mx = int(x) self.my = int(y) + # Any mouse movement over the canvas grabs focus, so we keyboard events. if not widget.is_focus(): widget.grab_focus() + # Process the update (unless we are animating). if not self.update_timer: self.update() - self.flush_cursor() + #self.flush_cursor() return True @@ -1039,6 +1039,9 @@ class Colors(activity.Activity, ExportedGObject): if button & Colors.BUTTON_SCROLL: self.set_mode(Colors.MODE_SCROLL) return + if self.cur_buttons & Colors.BUTTON_PICK: + self.set_mode(Colors.MODE_PICK) + return if self.mode == Colors.MODE_PALETTE: if button & Colors.BUTTON_PALETTE: @@ -1055,6 +1058,10 @@ class Colors(activity.Activity, ExportedGObject): if button & Colors.BUTTON_SCROLL: self.set_mode(Colors.MODE_CANVAS) return + if self.mode == Colors.MODE_PICK: + if button & Colors.BUTTON_PICK: + self.set_mode(Colors.MODE_CANVAS) + return def on_hold (self, button): pass @@ -1277,7 +1284,7 @@ class Colors(activity.Activity, ExportedGObject): #log.debug("x=%d y=%d width=%d height=%d" % (x, y, w, h)) - self.easelarea.queue_draw_area(int(mn.x), int(mn.y), int(mx.x-mn.x+1), int(mx.y-mn.y+1)) + self.draw_easelarea(gtk.gdk.Rectangle(int(mn.x), int(mn.y), int(mx.x-mn.x+1), int(mx.y-mn.y+1))) self.easel.reset_dirty_rect() @@ -1298,7 +1305,7 @@ class Colors(activity.Activity, ExportedGObject): x1 = max(self.lastmx+self.lastr, self.mx+r) y1 = max(self.lastmy+self.lastr, self.my+r) - self.easelarea.queue_draw_area(x0, y0, x1-x0+2, y1-y0+2) + self.draw_easelarea(gtk.gdk.Rectangle(x0, y0, x1-x0+2, y1-y0+2)) #----------------------------------------------------------------------------------------------------------------- # Application states @@ -1345,8 +1352,11 @@ class Colors(activity.Activity, ExportedGObject): self.playbackpos.set_value(100) self.playbackposbar.ignore_change -= 1 + if self.mode == Colors.MODE_PICK: + self.easelarea.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.CROSSHAIR)) + if self.mode == Colors.MODE_SCROLL: - self.scrollref = None + self.easelarea.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR)) if self.mode == Colors.MODE_PALETTE: # This simply darkens the canvas slightly to prepare for an overlay to be drawn on top. @@ -1356,8 +1366,8 @@ class Colors(activity.Activity, ExportedGObject): self.easelarea.set_double_buffered(True) self.brush_controls.set_brush(self.easel.brush) self.brush_controls.show_all() - self.flush_entire_canvas() self.overlay_active = True + self.flush_entire_canvas() self.palettebtn.set_active(True) #if self.mode == Colors.MODE_REFERENCE: @@ -1371,16 +1381,19 @@ class Colors(activity.Activity, ExportedGObject): self.easel.clear() self.easel.reset_brush() self.flush_entire_canvas() - + if self.mode == Colors.MODE_PLAYBACK: self.easel.stop_playback() - + if self.mode == Colors.MODE_CANVAS: self.end_draw() - + + if self.mode == Colors.MODE_PICK: + self.easelarea.window.set_cursor(None) + if self.mode == Colors.MODE_SCROLL: - pass - + self.easelarea.window.set_cursor(None) + if self.mode == Colors.MODE_PALETTE: self.set_brush(self.brush_controls.brush) #self.easel.clear_overlay() @@ -1432,18 +1445,19 @@ class Colors(activity.Activity, ExportedGObject): # Update drawing. if self.cur_buttons & Colors.BUTTON_TOUCH: - if self.cur_buttons & Colors.BUTTON_CONTROL: - self.pickup_color(Pos(self.mx, self.my)) - else: - if self.mx != self.lastmx or self.my != self.lastmy: - self.draw(Pos(self.mx, self.my)) - self.flush_dirty_canvas() + if self.mx != self.lastmx or self.my != self.lastmy: + self.draw(Pos(self.mx, self.my)) + self.flush_dirty_canvas() else: if self.easel.stroke: self.end_draw() self.flush_dirty_canvas() - + + if self.mode == Colors.MODE_PICK: + if self.cur_buttons & Colors.BUTTON_TOUCH: + self.pickup_color(Pos(self.mx, self.my)) + if self.mode == Colors.MODE_SCROLL: if self.cur_buttons & Colors.BUTTON_TOUCH: mpos = Pos(self.mx, self.my) @@ -1474,10 +1488,12 @@ class Colors(activity.Activity, ExportedGObject): def update (self): if self.easel == None: return + self.update_input() + if not self.overlay_active: self.update_mode() - + # When called from timer events, stop timer when not in playback anymore. if self.mode == Colors.MODE_PLAYBACK or self.mode == Colors.MODE_INTRO: return True @@ -1500,24 +1516,26 @@ class Colors(activity.Activity, ExportedGObject): # Resize panels. self.brush_controls.set_size_request(rect[2], rect[3]) self.progress.set_size_request(rect[2], rect[3]) - - return True - def on_canvasarea_expose (self, widget, event): + def draw_easelarea(self, bounds): if not self.easelarea.bin_window: - return True + return rect = self.easelarea.get_allocation() if self.easelimage is None or (rect[2] != self.width or rect[3] != self.height): self.on_canvasarea_resize() + + bounds = bounds.intersect(rect) + if bounds.width <= 0 or bounds.height <= 0: + return gc = self.easelarea.get_style().fg_gc[gtk.STATE_NORMAL] # Blit dirty rectangle of canvas into the image. - dest_x = int(event.area.x) - dest_y = int(event.area.y) - dest_w = int(event.area.width) - dest_h = int(event.area.height) + dest_x = int(bounds.x) + dest_y = int(bounds.y) + dest_w = int(bounds.width) + dest_h = int(bounds.height) if self.zoom == 1.0: spos = self.screen_to_easel(Pos(dest_x, dest_y)) @@ -1552,11 +1570,11 @@ class Colors(activity.Activity, ExportedGObject): # Then draw the image to the screen. self.easelarea.bin_window.draw_image( gc, self.easelimage, - event.area.x, event.area.y, - event.area.x, event.area.y, event.area.width, event.area.height) + bounds.x, bounds.y, + bounds.x, bounds.y, bounds.width, bounds.height) # Debug rectangle to test the dirty rectangle code. It should tightly box the brush at all times. - #self.easelarea.bin_window.draw_rectangle(gc, False, event.area.x, event.area.y, event.area.width, event.area.height) + #self.easelarea.bin_window.draw_rectangle(gc, False, bounds.x, bounds.y, bounds.width, bounds.height) # Draw introduction text. if self.mode == Colors.MODE_INTRO: @@ -1575,7 +1593,12 @@ class Colors(activity.Activity, ExportedGObject): # Hack to keep toolbar up to date. For some reason it fails to draw pretty often. #self.toolbox.queue_draw() - + + def on_easelarea_expose (self, widget, event): + self.draw_easelarea(event.area) + + return False + def on_palette (self, button): if button.get_active(): if self.mode != Colors.MODE_PALETTE: @@ -1595,9 +1618,13 @@ class Colors(activity.Activity, ExportedGObject): def on_zoom_in (self, button): self.zoom_in() + if self.my <= 0: + self.center_image() def on_zoom_out (self, button): self.zoom_out() + if self.my <= 0: + self.center_image() def on_center (self, button): self.center_image() @@ -1652,13 +1679,25 @@ class Colors(activity.Activity, ExportedGObject): def on_fullscreen(self, widget): self.fullscreen() - self.center_image() + self.scroll = Pos(0, 0) def on_clear (self, button): - if self.mode != Colors.MODE_CANVAS: - self.set_mode(Colors.MODE_CANVAS) - self.easel.clear() - self.flush_entire_canvas() + msg = alert.ConfirmationAlert() + msg.props.title = _('Clear Canvas?') + msg.props.msg = _('This will erase the entire image, including the history.') + + def alert_response_cb(alert, response_id, self): + self.remove_alert(alert) + if response_id is gtk.RESPONSE_OK: + if self.mode != Colors.MODE_CANVAS: + self.set_mode(Colors.MODE_CANVAS) + self.easel.clear() + self.flush_entire_canvas() + + msg.connect('response', alert_response_cb, self) + + self.add_alert(msg) + msg.show_all() def on_play (self, button): # Change to playback mode when the Play button is first pressed. @@ -1706,11 +1745,11 @@ class Colors(activity.Activity, ExportedGObject): self.set_mode(Colors.MODE_CANVAS) self.easel.clear() self.easel.load(file_path.encode()) - self.set_mode(Colors.MODE_PLAYBACK) self.easel.start_playback() self.easel.finish_playback() self.playbackpos.set_value(100) - self.flush_entire_canvas() + #self.play_to_playbackpos() + self.set_mode(Colors.MODE_CANVAS) log.debug("Played back %d commands", self.easel.playback_length()) def write_file(self, file_path): @@ -1732,33 +1771,21 @@ class Colors(activity.Activity, ExportedGObject): # Clipboard integration (ported from Oficina) def on_copy(self, button): - pbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, self.width, self.height) - pbuf = pbuf.get_from_image(self.easelimage, self.easelarea.get_colormap(), 0, 0, 0, 0, self.width, self.height) + w = self.easel.width*2 + h = self.easel.height*2 - temppath = os.path.join(os.environ.get('SUGAR_ACTIVITY_ROOT'), 'instance') - f, clipname = tempfile.mkstemp(suffix='.png', dir=temppath) - del f + image = gtk.gdk.Image(gtk.gdk.IMAGE_FASTEST, gtk.gdk.visual_get_system(), w, h) + self.easel.blit_2x(image, 0, 0, 0, 0, w, h, False) - pbuf.save(clipname, 'png') - os.chmod(clipname, 0604) + pbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, w, h) + pbuf = pbuf.get_from_image(image, self.easelarea.get_colormap(), 0, 0, 0, 0, w, h) - cb = gtk.Clipboard() - cb.set_with_data( [('text/uri-list', 0, 0)], self.copy_get_cb, self.copy_clear_cb, clipname) + cb = gtk.clipboard_get() + cb.set_image(pbuf) def on_paste(self, button): pass - def copy_get_cb(self, clipboard, selection_data, info, data): - clipname = data - if selection_data.target == "text/uri-list": - selection_data.set_uris(['file://' + clipname]) - - def copy_clear_cb( self, clipboard, data ): - if data != None: - if os.path.exists(data): - os.remove(data) - data = None - #----------------------------------------------------------------------------------------------------------------- # Benchmarking # diff --git a/setupwacom.sh b/setupwacom.sh index a07023e..ba1ac48 100755 --- a/setupwacom.sh +++ b/setupwacom.sh @@ -4,9 +4,14 @@ echo Installing linuxwacom package... yum -y install linuxwacom echo Copying and installing Wacom kernel module... +mkdir /lib/modules/`uname -r`/kernel/drivers/usb/input wget http://dev.laptop.org/~pgf/wacom.ko -O /lib/modules/`uname -r`/kernel/drivers/usb/input/wacom.ko echo Copying Xorg configuration file... wget http://dev.laptop.org/~wadeb/xorg-dcon.conf -O /etc/X11/xorg-dcon.conf +echo Building kernel module dependenies... +depmod +modprobe wacom + echo Wacom installation complete! Please restart your XO. diff --git a/xorg-dcon.conf b/xorg-dcon.conf deleted file mode 100644 index eb2a9e4..0000000 --- a/xorg-dcon.conf +++ /dev/null @@ -1,145 +0,0 @@ -# Xorg configuration file for OLPC - -Section "ServerLayout" - Identifier "Default Layout" - Screen 0 "Screen0" 0 0 - InputDevice "Wacom Tablet" "SendCoreEvents" - InputDevice "Wacom Pen" "SendCoreEvents" - InputDevice "Wacom Eraser" "SendCoreEvents" - InputDevice "Wacom Mouse" "SendCoreEvents" -EndSection - -#Section "ServerFlags" - #Option "AllowEmptyInput" "yes" -#EndSection - -Section "Module" - SubSection "extmod" - Option "omit XFree86-DGA" - #Option "omit XFree86-Misc" # needed by 'xset m' - Option "omit MIT-SUNDRY-NONSTANDARD" - Option "omit TOG-CUP" - Option "omit Extended-Visual-Information" - EndSubSection - Load "freetype" - Load "evdev" - # Load "record" # Mostly a debugging tool -EndSection - -Section "Extensions" - Option "XTEST" "Disable" # Mostly a debugging tool - #Option "SECURITY" "Disable" # CRASH! - Option "XC-APPGROUP" "Disable" - Option "XINERAMA" "Disable" -EndSection - -Section "Monitor" - Identifier "Monitor0" - HorizSync 30-67 - VertRefresh 48-52 - DisplaySize 152 114 - Mode "1200x900" - DotClock 57.275 - HTimings 1200 1208 1216 1240 - VTimings 900 905 908 912 - Flags "-HSync" "-VSync" - EndMode -EndSection - -Section "Device" - Identifier "Videocard0" - Driver "amd" - VendorName "Advanced Micro Devices, Inc." - BoardName "AMD Geode GX/LX" - - Option "AccelMethod" "EXA" - Option "NoCompression" "true" - Option "PanelGeometry" "1200x900" -EndSection - -Section "Screen" - Identifier "Screen0" - Device "Videocard0" - Monitor "Monitor0" - DefaultDepth 16 - SubSection "Display" - Depth 16 - Modes "1200x900" - EndSubSection -EndSection -Section "InputDevice" - Identifier "fake" - Driver "void" -EndSection - -Section "InputDevice" - Identifier "ATKbd" - Driver "evdev" - - Option "Name" "AT Translated Set 2 keyboard" - Option "evBits" "+1" - Option "keyBits" "~1-255 ~352-511" - Option "Pass" "2" -EndSection -Section "InputDevice" - Identifier "Keyboard" - Driver "evdev" - - Option "evBits" "+1" - Option "keyBits" "~1-115 ~117-255" - Option "Pass" "3" -EndSection - -Section "InputDevice" - Identifier "Mouse" - Driver "evdev" - - Option "evBits" "+1-2" - Option "keyBits" "~272-287" - Option "Pass" "3" -EndSection -Section "InputDevice" - Identifier "GS" - Driver "evdev" - - Option "Name" "OLPC ALPS GlideSensor" - Option "evBits" "+1 +3" - Option "keyBits" "~272-287" - Option "absBits" "~0-2 ~24" - Option "Pass" "2" - Option "Mode" "Relative" -EndSection - -Section "InputDevice" - Driver "wacom" - Identifier "Wacom Pen" - Option "Device" "/dev/input/wacom" - Option "Type" "stylus" - Option "USB" "on" - Option "PressCurve" "0,0,100,100" -EndSection -Section "InputDevice" - Driver "wacom" - Identifier "Wacom Eraser" - Option "Device" "/dev/input/wacom" - Option "Type" "eraser" - Option "USB" "on" -EndSection -Section "InputDevice" - Driver "wacom" - Identifier "Wacom Mouse" - Option "Device" "/dev/input/wacom" - Option "Type" "cursor" - Option "Mode" "relative" - Option "USB" "on" -EndSection -Section "InputDevice" - Driver "wacom" - Identifier "Wacom Tablet" - Option "Device" "/dev/input/wacom" - Option "Type" "pad" - Option "ButtonsOnly" "on" - Option "Button9" "2" - Option "Button10" "3" - Option "USB" "on" -EndSection -- cgit v0.9.1