#!/usr/bin/python #coding=utf8 WIDTH = 480 HEIGHT = 640 TITLE = "pyphone" WM_NAME = "pyphone" WM_CLASS = "swallow" import os import sys import e_dbus import evas import evas.decorators import edje import edje.decorators import ecore import ecore.evas from dbus import SystemBus, Interface from optparse import OptionParser import time class edje_group(edje.Edje): def __init__(self, main, group): self.main = main f = os.path.splitext(sys.argv[0])[0] + ".edj" try: edje.Edje.__init__(self, self.main.evas_canvas.evas_obj.evas, file=f, group=group) except edje.EdjeLoadError, e: raise SystemExit("error loading %s: %s" % (f, e)) self.size = self.main.evas_canvas.evas_obj.evas.size @edje.decorators.signal_callback("transition:*", "*") def on_edje_signal_transition(self, emission, source): if not self.main.in_transition: self.main.in_transition = True self.main.transition_to(emission.split(':')[1]) @edje.decorators.signal_callback("finished_transition", "*") def on_edje_signal_finished_transition(self, emission, source): self.main.transition_finished() self.main.in_transition = False class pyphone_main(edje_group): def __init__(self, main): edje_group.__init__(self, main, "main") class pyphone_phone(edje_group): def __init__(self, main): edje_group.__init__(self, main, "phone") self.text = [] @edje.decorators.signal_callback("dialer_button_pressed", "*") def on_edje_signal_dialer_button_pressed(self, emission, source): if "button_" in source: key = source.split("_", 1)[1] if key in ("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "#"): self.text.append(key) self.part_text_set("label", "".join(self.text)) elif key in "star": self.text.append("*") self.part_text_set("label", "".join(self.text)) elif key in "delete": self.text = self.text[:-1] self.part_text_set("label", "".join(self.text)) else: key = source #self.text.append(source) #self.part_text_set("label", "".join(self.text)) class pyphone_sms(edje_group): def __init__(self, main): edje_group.__init__(self, main, "sms") self.text = [] self.button_labels2 = [ [ [".,?!", "abc", "def", ""], ["ghi", "jkl", "mno", ""], ["pqrs", "tuv", "wxyz", ""], ["", "", "⇦⇧⇨", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ] ] self.button_labels = [ [ ["1", "2", "3", "↤"], ["4", "5", "6", "↲"], ["7", "8", "9", "Abc"], ["+", "0", "⇩", "+"], ], [ ["1", "?", "", ""], [".", ",", "", ""], ["!", "", "", ""], ["", "", "", ""], ], [ ["", "2", "c", ""], ["", "a", "b", ""], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "3", "f"], ["", "", "d", "e"], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "", "↤"], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["4", "i", "", ""], ["g", "h", "", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["", "5", "l", ""], ["", "j", "k", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["", "", "6", "o"], ["", "", "m", "n"], ["", "", "", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["", "s", "", ""], ["7", "r", "", ""], ["p", "q", "", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "8", "v", ""], ["", "t", "u", ""], ], [ ["", "", "", ""], ["", "", "", "z"], ["", "", "9", "y"], ["", "", "w", "x"], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", " ", "", ""], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "⇧", ""], ["", "⇦", "⇩", "⇨"], ], [ ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ["", "", "", ""], ] ] self.set_button_text(0) self.active = 0 @edje.decorators.signal_callback("kb_button_mouse_up", "*") def on_edje_signal_dialer_button_mouse_up(self, emission, source): now = time.time() x = int(source[-3:-2]) y = int(source[-1:]) key = self.button_labels[self.active][y][x] self.text.append(key) self.part_text_set("label", "".join(self.text)) self.set_button_text(0) print "mouse up:", time.time()-now @edje.decorators.signal_callback("kb_button_mouse_down", "*") def on_edje_signal_dialer_button_mouse_down(self, emission, source): now = time.time() x = int(source[-3:-2]) y = int(source[-1:]) num = 4*y+x+1 if self.active == 0: self.set_button_text(num) print "mouse down:", time.time()-now @edje.decorators.signal_callback("kb_mutton_mouse_in", "*") def on_edje_signal_dialer_button_mouse_in(self, emission, source): now = time.time() x = int(source[-3:-2]) y = int(source[-1:]) self.part_text_set("label_preview", self.button_labels[self.active][y][x]) print "mouse in:", time.time()-now def set_button_text(self, num): for i in xrange(4): for j in xrange(4): self.part_text_set("label_%d_%d" % (i,j) , self.button_labels[num][j][i]) self.active = num if num != 0: num = 1 for i in xrange(4): for j in xrange(4): self.part_text_set("label2_%d_%d" % (i,j) , self.button_labels2[num][j][i]) class TestView(object): def on_key_down(self, obj, event): if event.keyname in ("F6", "f"): self.evas_canvas.evas_obj.fullscreen = not self.evas_canvas.evas_obj.fullscreen elif event.keyname == "Escape": ecore.main_loop_quit() def __init__(self): self.options, self.args = myOptionParser(usage="usage: %prog [options]").parse_args() edje.frametime_set(1.0 / self.options.fps) self.evas_canvas = EvasCanvas( fullscreen=not self.options.no_fullscreen, engine=self.options.engine, size=self.options.geometry ) self.groups = {} for part in ("swallow", "main", "contacts", "power"): self.groups[part] = edje_group(self, part) self.evas_canvas.evas_obj.data[part] = self.groups[part] self.groups["sms"] = pyphone_sms(self) self.evas_canvas.evas_obj.data["sms"] = self.groups["sms"] self.groups["phone"] = pyphone_phone(self) self.evas_canvas.evas_obj.data["phone"] = self.groups["phone"] self.groups["swallow"].show() self.groups["swallow"].on_key_down_add(self.on_key_down) self.groups["swallow"].part_swallow("swallow2", self.groups["main"]) self.current_group = self.groups["main"] self.previous_group = self.groups["phone"] self.in_transition = False ecore.timer_add(1.0, self.display_time) self.display_time() def display_time(self): self.groups["main"].part_text_set("label", time.strftime("%H:%M:%S", time.localtime())); return True; def transition_to(self, target): print "transition to", target self.previous_group = self.current_group self.current_group = self.groups[target] self.current_group.signal_emit("visible", "") self.groups["swallow"].part_swallow("swallow1", self.current_group) self.previous_group.signal_emit("fadeout", "") def transition_finished(self): print "finished" self.previous_group.hide() self.groups["swallow"].part_swallow("swallow2", self.current_group) class EvasCanvas(object): def __init__(self, fullscreen, engine, size): if engine == "x11": f = ecore.evas.SoftwareX11 elif engine == "x11-16": if ecore.evas.engine_type_supported_get("software_x11_16"): f = ecore.evas.SoftwareX11_16 else: print "warning: x11-16 is not supported, fallback to x11" f = ecore.evas.SoftwareX11 self.evas_obj = f(w=size[0], h=size[1]) self.evas_obj.callback_delete_request = self.on_delete_request self.evas_obj.callback_resize = self.on_resize self.evas_obj.title = TITLE self.evas_obj.name_class = (WM_NAME, WM_CLASS) self.evas_obj.fullscreen = False #fullscreen self.evas_obj.size = size self.evas_obj.show() def on_resize(self, evas_obj): x, y, w, h = evas_obj.evas.viewport size = (w, h) for key in evas_obj.data.keys(): evas_obj.data[key].size = size def on_delete_request(self, evas_obj): ecore.main_loop_quit() class myOptionParser(OptionParser): def __init__(self, usage): OptionParser.__init__(self, usage) self.add_option("-e", "--engine", type="choice", choices=("x11", "x11-16"), default="x11-16", help=("which display engine to use (x11, x11-16), " "default=%default")) self.add_option("-n", "--no-fullscreen", action="store_true", help="do not launch in fullscreen") self.add_option("-g", "--geometry", type="string", metavar="WxH", action="callback", callback=self.parse_geometry, default=(WIDTH, HEIGHT), help="use given window geometry") self.add_option("-f", "--fps", type="int", default=20, help="frames per second to use, default=%default") def parse_geometry(option, opt, value, parser): try: w, h = value.split("x") w = int(w) h = int(h) except Exception, e: raise optparse.OptionValueError("Invalid format for %s" % option) parser.values.geometry = (w, h) class dbus(object): def __init__(self): try: obj = SystemBus(mainloop=e_dbus.DBusEcoreMainLoop()).get_object('org.mobile.gsm', '/org/mobile/gsm/RemoteObject') except Exception, e: print e raise SystemExit #connect functions to dbus events dbus_interface = 'org.mobile.gsm.RemoteInterface' for fkt in (self.modem_info, self.sim_info, self.network_info, self.gsmCRING, self.gsmNO_CARRIER, self.gsmBUSY, self.error,): obj.connect_to_signal(fkt.__name__, fkt, dbus_interface=dbus_interface) gsm = Interface(obj, dbus_interface) #get status info on startup gsm.FireModemInfo() gsm.FireNetworkInfo() def modem_info(self, array): print array def sim_info(self, array): print array def network_info(self, array): print array def gsmBUSY(self, string): print string def gsmCRING(self, string): print string def gsmNO_CARRIER(self, *values): print values def error(self, string): print string if __name__ == "__main__": TestView() #dbus() ecore.main_loop_begin() ''' export CPPFLAGS="$CPPFLAGS -I/opt/e17/include" export LDFLAGS="$LDFLAGS -L/opt/e17/lib" export PKG_CONFIG_PATH="/opt/e17/lib/pkgconfig:$PKG_CONFIG_PATH" export PATH="$PATH:/opt/e17/bin" export PYTHONPATH="/home/josch/usr/lib/python2.5/site-packages" '''