From e12dbff4dda5aafbaac98f75f0467ef00dc06c32 Mon Sep 17 00:00:00 2001 From: Nat Date: Thu, 13 Sep 2007 15:55:52 +0000 Subject: Activity split --- (limited to 'common/Util/Trackpad.py') diff --git a/common/Util/Trackpad.py b/common/Util/Trackpad.py new file mode 100644 index 0000000..0ddb929 --- /dev/null +++ b/common/Util/Trackpad.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +import pygtk +pygtk.require( '2.0' ) +import gtk +import gobject + +from common.Util.CSoundClient import new_csound_client +import common.Config as Config + +KEY_MAP_PIANO = Config.KEY_MAP_PIANO + +class Trackpad: + def __init__(self, win): + self.win = win + self.csnd = new_csound_client() + win.add_events(gtk.gdk.POINTER_MOTION_MASK) + win.add_events(gtk.gdk.BUTTON_PRESS_MASK) + win.add_events(gtk.gdk.BUTTON_RELEASE_MASK) + win.connect('motion-notify-event',self.handle_motion) + win.connect('key-press-event',self.handle_keyPress) + win.connect('key-release-event',self.handle_keyRelease) + + self.first_x = None + self.current_x = None + self.final_x = None + self.first_y = None + self.current_y = None + self.final_y = None + + self.buttonPressed = False + + self.create_invisible_cursor() + + self.display = self.win.get_display() + self.screen = gtk.gdk.Display.get_default_screen(self.display) + self.context = None + + def setContext(self, context): + self.context = context + + def create_invisible_cursor(self): + pix_data = """/* XPM */ + static char * invisible_xpm[] = { + "1 1 1 1", + " c None", + " "};""" + color = gtk.gdk.Color() + pix = gtk.gdk.pixmap_create_from_data(None, pix_data, 1, 1, 1, color, color) + self.invisible_cursor = gtk.gdk.Cursor(pix,pix,color,color,0,0) + + def handle_motion(self,widget,event): + if self.context != 'edit': + if event.x < 0: + X = 0 + elif event.x > self.screen.get_width(): + X = self.screen.get_width() + else: + X = event.x + + if event.y < 0: + Y = 0 + elif event.y > self.screen.get_height(): + Y = self.screen.get_height() + else: + Y = event.y + + self.current_x = X + self.current_y = Y + if self.buttonPressed: + self.final_x = X - self.first_x + self.final_y = Y - self.first_y + self.csnd.setTrackpadX(self.final_x) + self.csnd.setTrackpadY(self.final_y) + + def handle_keyPress(self,widget,event): + if KEY_MAP_PIANO.has_key(event.hardware_keycode) and self.buttonPressed == False: + gtk.gdk.Display.warp_pointer(self.display, self.screen, self.screen.get_width() / 2, self.screen.get_height() / 2) + gtk.gdk.pointer_grab(self.win.window, event_mask = gtk.gdk.POINTER_MOTION_MASK)#, cursor = self.invisible_cursor) + self.buttonPressed = True + self.first_x = self.screen.get_width() / 2 + self.first_y = self.screen.get_height() / 2 + + def handle_keyRelease(self,widget,event): + if KEY_MAP_PIANO.has_key(event.hardware_keycode): + gtk.gdk.pointer_ungrab(time = 0L) + self.buttonPressed = False + self.restoreDelay = gobject.timeout_add(120, self.restore) + + def restore( self ): + self.csnd.setTrackpadX(0) + self.csnd.setTrackpadY(0) + gobject.source_remove( self.restoreDelay ) + -- cgit v0.9.1