Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TamTamJam.activity/common/Util/Trackpad.py
diff options
context:
space:
mode:
Diffstat (limited to 'TamTamJam.activity/common/Util/Trackpad.py')
-rw-r--r--TamTamJam.activity/common/Util/Trackpad.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/TamTamJam.activity/common/Util/Trackpad.py b/TamTamJam.activity/common/Util/Trackpad.py
new file mode 100644
index 0000000..64f9a81
--- /dev/null
+++ b/TamTamJam.activity/common/Util/Trackpad.py
@@ -0,0 +1,95 @@
+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):
+ if not Config.FEATURES_GRAB_MOUSE:
+ return
+
+ 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 )
+