You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

416 lines
13 KiB
Python

#!/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"
'''