#!/usr/bin/env python # based on: # http://svn.openmoko.org/developers/tick/touchtest/touch_test.py import evas import ecore import ecore.evas import sys import thread import struct from math import sqrt import time import os acc_x = 0 acc_y = 0 lock = thread.allocate_lock() pool = [] def cleaner_cb(cell, ev, *a, **ka): lock.acquire() global pool for p in pool: p.delete() pool = [] lock.release() def mousedown_cb(cell, ev, *a, **ka): x = ev.position.canvas.x y = ev.position.canvas.y dot = canvas.Rectangle(size=(5,5), pos=(x,y), color=(0, 255, 0, 255)) dot.pass_events_set(True) #print "Down: ("+str(x)+", "+str(y)+")" lock.acquire() dot.show() pool.append(dot) lock.release() return True def update(): while True: lock.acquire() global pool for p in pool: p.hide() p.pos = (p.pos[0] + acc_x, p.pos[1] + acc_y) #print p.pos p.show() lock.release() time.sleep(0.2) def try_to_put_a_screen(ee, filename): screen = canvas.Image() screen.file_set(filename) w,h = ee.size screen.move(0,0) screen.resize(w,h) screen.fill_set(0,0,w, h) screen.pass_events_set(True) return screen def query_accel(): """runs in separate thread""" global acc_x global acc_y file = os.open('/dev/input/event3', os.O_RDONLY) while True: x = 0 y = 0 event = os.read(file, 16) while event: (time1,time2, type, code, value) = \ struct.unpack('iihhi', event) if type == 3: if code == 0: x = value if code == 1: y = value if type == 0 and code == 0: sum = int(sqrt(x*x + y*y)) / 5 if sum: x /= sum y /= sum else: x = 0 y = 0 acc_x = x acc_y = -y event = os.read(file, 16) if __name__ == '__main__': ee = ecore.evas.SoftwareX11(w=480, h=590) ee.title_set("Touch Test") canvas = ee.evas bg = canvas.Rectangle(color=(0, 0, 0, 255)) bg.size = canvas.size bg.propagate_events = True bg.on_mouse_down_add(mousedown_cb) if len(sys.argv) >= 2: screen = try_to_put_a_screen(ee, sys.argv[1]) screen.show() cleaner = canvas.Rectangle(size=(50,50), pos=(50,0), color=(255, 255, 255, 255)) cleaner.on_mouse_down_add(cleaner_cb) bg.show() cleaner.show() ee.show() thread.start_new_thread(query_accel, ()) thread.start_new_thread(update, ()) ecore.main_loop_begin()