From: Juke Date: Tue, 9 Feb 2010 23:18:48 +0000 (+0100) Subject: new package -3 X-Git-Url: http://git.maemo.org/git/?p=masstransit;a=commitdiff_plain;h=9a008a9b1bdbff8c974d39e1e6b4c22d94e9b948 new package -3 --- diff --git a/TODO b/TODO index 2cc4fbd..673c456 100644 --- a/TODO +++ b/TODO @@ -31,8 +31,10 @@ TODO : etre ok sur pylint TODO : faire des try sur les import TODO : documenter les classes + TODO : corriger le deb (lanceur + chmod) DONE 0.1.1 : Modélisation Objet DONE 0.1.2 : Corriger l'indentation DONE 0.1.3 : Faire un objet ListeHoraire DONE 0.1.4 : Faire un .deb + diff --git a/build_myapp.py b/build_myapp.py index 2cb7dce..97d10e2 100644 --- a/build_myapp.py +++ b/build_myapp.py @@ -29,8 +29,7 @@ if __name__ == "__main__": p.distribution="fremantle" p.repository="extras-devel" p.xsbc_bugtracker="http://bugs.maemo.org" - # p.postinstall="""#!/bin/sh - # chmod +x /usr/bin/mclock.py""" #Set here your post install script + p.postinstall="""#!/bin/sh chmod +x /opt/masstransit/masstransit.py """ #Set here your post install script # p.postremove="""#!/bin/sh # chmod +x /usr/bin/mclock.py""" #Set here your post remove script # p.preinstall="""#!/bin/sh @@ -38,7 +37,7 @@ if __name__ == "__main__": # p.preremove="""#!/bin/sh # chmod +x /usr/bin/mclock.py""" #Set here your pre remove script version = "0.1.3" #Version of your software, e.g. "1.2.0" or "0.8.2" - build = "1" #Build number, e.g. "1" for the first build of this version of your software. Increment for later re-builds of the same version of your software. + build = "3" #Build number, e.g. "1" for the first build of this version of your software. Increment for later re-builds of the same version of your software. #Text with changelog information to be displayed in the package "Details" tab of the Maemo Application Manager changeloginformation = "Fixed (large) icon." dir_name = "src" #Name of the subfolder containing your package source files (e.g. usr\share\icons\hicolor\scalable\myappicon.svg, usr\lib\myapp\somelib.py). We suggest to leave it named src in all projects and will refer to that in the wiki article on maemo.org diff --git a/masstransit.desktop b/masstransit.desktop deleted file mode 100644 index 03f0117..0000000 --- a/masstransit.desktop +++ /dev/null @@ -1,13 +0,0 @@ - [Desktop Entry] - Version=1.0.0 Version of this file, NOT of the app. Keep it at 1.0.0 - Encoding=UTF-8 - Name=masstransit Name of the app as seen in Menu - Comment=Horaires de bus Description of the app as seen as subtitle in Menu in Finger mode - Exec=/opt/masstransit/masstransit.py Link to the app - Icon=masstransit Name of our icon file, without the trailing .png part - X-Icon-path=/usr/share/icons Path to the icon - X-Window-Icon=masstransit Name of our icon file, without the trailing .png part (again?!) - Type=Application -# X-Osso-Service=com.nokia.masstransit - X-Osso-Type=application/x-executable -# StartupWMClass=mClock Only needed because it's a PyGame app (would be automatic with GTK) diff --git a/src/example.cfg b/src/example.cfg deleted file mode 100644 index b7d87ce..0000000 --- a/src/example.cfg +++ /dev/null @@ -1,10 +0,0 @@ -[ListeDesGares] -bibliotheque francois mitterand = BFM -savigny sur orge = SAO -melun = MEL -juvisy = JY -gare de lyon = PAA -chatelet = CLX -villeneuve st georges = VSG -le mee = WEE - diff --git a/src/masstransit.py b/src/masstransit.py deleted file mode 100755 index 85d9406..0000000 --- a/src/masstransit.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/python -import pygtk -pygtk.require("2.0") -import gtk -import urllib2 -import HTMLParser -import hildon -import ConfigParser - -from portrait import FremantleRotation - -#main_window = mainWindow # your main hildon.StackableWindow -app_name = 'NameOfYourApp' # the name of your app -app_version = '1.0' # the version number of your app -initial_mode = FremantleRotation.AUTOMATIC - -class LigneHoraire(object): - def __init__(self, code_mission, heure_de_passage): - self.code_mission = code_mission - self.heure_de_passage = heure_de_passage - - def add_to_treestore(self, treestore): - print treestore - treestore.append(None, [self.code_mission, self.heure_de_passage]) - - - -class tableParser(HTMLParser.HTMLParser): - def __init__(self): - HTMLParser.HTMLParser.__init__(self) - self.table_horaires3 = False - self.code_de_mission = False - self.a_code_de_mission = False - self.heure_de_passage = False - self.liste_train = [] - self.liste_horaire = [] - self.list_ligne_horaire = [] - - def handle_starttag(self, tag, attrs): - if (tag == 'table' and (dict(attrs)['class'] == 'horaires3')): - self.table_horaires3 = True - - elif self.table_horaires3 and tag == 'td': - try: - self.code_de_mission = ( - dict(attrs)['headers'] == 'Code_de_mission') - self.heure_de_passage = ( - dict(attrs)['headers'] == 'Heure_de_passage') - except KeyError: - if dict(attrs).has_key('headers'): - raise - else: - pass - else: - self.a_code_de_mission = (tag == 'a' and self.code_de_mission) - - def handle_data(self, data): - if self.a_code_de_mission: - self.liste_train.append(data.strip()) - if self.heure_de_passage: - self.liste_horaire.append(data.strip()) - - def handle_endtag(self,tag): - self.a_code_de_mission ^= (self.a_code_de_mission and tag == 'a') - self.heure_de_passage ^= (self.heure_de_passage and tag == 'td') - - def get_list_ligne_horaire(self): - print 'get_list_ligne_horaire' - z = 0 - print self.liste_train - for i in self.liste_train: - self.list_ligne_horaire.append(LigneHoraire(code_mission=i, heure_de_passage=self.liste_horaire[z])) - z += 1 - return self.list_ligne_horaire - - - -class Trajet(object): - def __init__(self, gare_source, gare_dest): - self.gare_source = gare_source - self.gare_dest = gare_dest - self.parse() - def get_liste_train(self): - return self.p.liste_train - def get_liste_horaire(self): - return self.p.liste_horaire - def parse(self): - self.p = tableParser() - #print "URL:" - #print 'http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true' - rsrc = urllib2.urlopen('http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true') - self.p.feed(rsrc.read()) - print "parsing ok" - - def refresh_treestore(self, treestore): - print 'refresh' - print treestore - - treestore.clear() - liste_ligne_horaire = self.p.get_list_ligne_horaire() - print liste_ligne_horaire - for i in liste_ligne_horaire: - print i - i.add_to_treestore(treestore) - -class ConfFile(object): - def __init__(self, fichier): - self.c = ConfigParser.ConfigParser() - self.c.read(fichier) - def get_short_name(self, longname): - return self.c.get('ListeDesGares', longname) - def get_liste_des_gares(self): - return self.c.items('ListeDesGares') - -class LongNameGare(object): - def __init__(self, longname): - self.longname = longname - def get_gare(self, conffile): - short_name = conffile.get_short_name(self.longname) - return Gare(short_name) - -class Gare(object): - def __init__(self, shortname): - self.shortname = shortname - - - - -class TransilienUI: - def __init__(self): - mainWindow = hildon.Window() - mainWindow.set_title("Horaires des Prochains Trains") - mainWindow.connect("destroy", self.on_mainWindow_destroy) - - rotation_object = FremantleRotation(app_name, mainWindow, app_version, initial_mode) - refreshButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, - hildon.BUTTON_ARRANGEMENT_HORIZONTAL, "Actualiser") - refreshButton.connect("clicked", self.on_refreshButton_clicked) - - self.treestore = gtk.TreeStore(str, str) - self.treeview = gtk.TreeView(self.treestore) - - self.tvcolumn_train = gtk.TreeViewColumn('Train', gtk.CellRendererText(), text=0) - self.treeview.append_column(self.tvcolumn_train) - - self.tvcolumn_horaire = gtk.TreeViewColumn('Horaire', gtk.CellRendererText(), text=1) - self.treeview.append_column(self.tvcolumn_horaire) - - - picker_button_source = hildon.PickerButton(gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL) - picker_button_source.set_title("Gare de Depart") - self.combo_source = hildon.TouchSelectorEntry(text=True) - self.combo_dest = hildon.TouchSelectorEntry(text=True) - - for i in ConfFile('example.cfg').get_liste_des_gares(): - self.combo_source.append_text(i[0]) - self.combo_dest.append_text(i[0]) - picker_button_source.set_selector(self.combo_source) - - - picker_button_dest = hildon.PickerButton(gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL) - picker_button_dest.set_title("Gare d'arrivee") - picker_button_dest.set_selector(self.combo_dest) - - vBox = gtk.VBox() - hBox = gtk.HBox() - vBox.pack_start(hBox) - hBox.pack_start(picker_button_source) - hBox.pack_start(picker_button_dest) - vBox.pack_start(self.treeview) - vBox.pack_start(refreshButton) - - - mainWindow.add(vBox) - mainWindow.show_all() - - def on_mainWindow_destroy(self, widget): - gtk.main_quit() - - def on_refreshButton_clicked(self, widget): - gare_source = LongNameGare(self.combo_source.get_current_text()).get_gare(ConfFile('example.cfg')) - gare_dest = LongNameGare(self.combo_dest.get_current_text()).get_gare(ConfFile('example.cfg')) - trajet = Trajet(gare_source , gare_dest) - print trajet - print self.treestore - trajet.refresh_treestore(self.treestore) - - -if __name__ == "__main__": - TransilienUI() - gtk.main() diff --git a/src/opt/masstransit/example.cfg b/src/opt/masstransit/example.cfg new file mode 100644 index 0000000..b7d87ce --- /dev/null +++ b/src/opt/masstransit/example.cfg @@ -0,0 +1,10 @@ +[ListeDesGares] +bibliotheque francois mitterand = BFM +savigny sur orge = SAO +melun = MEL +juvisy = JY +gare de lyon = PAA +chatelet = CLX +villeneuve st georges = VSG +le mee = WEE + diff --git a/src/opt/masstransit/masstransit.py b/src/opt/masstransit/masstransit.py new file mode 100755 index 0000000..85d9406 --- /dev/null +++ b/src/opt/masstransit/masstransit.py @@ -0,0 +1,191 @@ +#!/usr/bin/python +import pygtk +pygtk.require("2.0") +import gtk +import urllib2 +import HTMLParser +import hildon +import ConfigParser + +from portrait import FremantleRotation + +#main_window = mainWindow # your main hildon.StackableWindow +app_name = 'NameOfYourApp' # the name of your app +app_version = '1.0' # the version number of your app +initial_mode = FremantleRotation.AUTOMATIC + +class LigneHoraire(object): + def __init__(self, code_mission, heure_de_passage): + self.code_mission = code_mission + self.heure_de_passage = heure_de_passage + + def add_to_treestore(self, treestore): + print treestore + treestore.append(None, [self.code_mission, self.heure_de_passage]) + + + +class tableParser(HTMLParser.HTMLParser): + def __init__(self): + HTMLParser.HTMLParser.__init__(self) + self.table_horaires3 = False + self.code_de_mission = False + self.a_code_de_mission = False + self.heure_de_passage = False + self.liste_train = [] + self.liste_horaire = [] + self.list_ligne_horaire = [] + + def handle_starttag(self, tag, attrs): + if (tag == 'table' and (dict(attrs)['class'] == 'horaires3')): + self.table_horaires3 = True + + elif self.table_horaires3 and tag == 'td': + try: + self.code_de_mission = ( + dict(attrs)['headers'] == 'Code_de_mission') + self.heure_de_passage = ( + dict(attrs)['headers'] == 'Heure_de_passage') + except KeyError: + if dict(attrs).has_key('headers'): + raise + else: + pass + else: + self.a_code_de_mission = (tag == 'a' and self.code_de_mission) + + def handle_data(self, data): + if self.a_code_de_mission: + self.liste_train.append(data.strip()) + if self.heure_de_passage: + self.liste_horaire.append(data.strip()) + + def handle_endtag(self,tag): + self.a_code_de_mission ^= (self.a_code_de_mission and tag == 'a') + self.heure_de_passage ^= (self.heure_de_passage and tag == 'td') + + def get_list_ligne_horaire(self): + print 'get_list_ligne_horaire' + z = 0 + print self.liste_train + for i in self.liste_train: + self.list_ligne_horaire.append(LigneHoraire(code_mission=i, heure_de_passage=self.liste_horaire[z])) + z += 1 + return self.list_ligne_horaire + + + +class Trajet(object): + def __init__(self, gare_source, gare_dest): + self.gare_source = gare_source + self.gare_dest = gare_dest + self.parse() + def get_liste_train(self): + return self.p.liste_train + def get_liste_horaire(self): + return self.p.liste_horaire + def parse(self): + self.p = tableParser() + #print "URL:" + #print 'http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true' + rsrc = urllib2.urlopen('http://www.transilien.com/web/ITProchainsTrainsAvecDest.do?codeTr3aDepart='+self.gare_source.shortname+'&codeTr3aDest='+self.gare_dest.shortname+'&urlModule=/site/pid/184&gareAcc=true') + self.p.feed(rsrc.read()) + print "parsing ok" + + def refresh_treestore(self, treestore): + print 'refresh' + print treestore + + treestore.clear() + liste_ligne_horaire = self.p.get_list_ligne_horaire() + print liste_ligne_horaire + for i in liste_ligne_horaire: + print i + i.add_to_treestore(treestore) + +class ConfFile(object): + def __init__(self, fichier): + self.c = ConfigParser.ConfigParser() + self.c.read(fichier) + def get_short_name(self, longname): + return self.c.get('ListeDesGares', longname) + def get_liste_des_gares(self): + return self.c.items('ListeDesGares') + +class LongNameGare(object): + def __init__(self, longname): + self.longname = longname + def get_gare(self, conffile): + short_name = conffile.get_short_name(self.longname) + return Gare(short_name) + +class Gare(object): + def __init__(self, shortname): + self.shortname = shortname + + + + +class TransilienUI: + def __init__(self): + mainWindow = hildon.Window() + mainWindow.set_title("Horaires des Prochains Trains") + mainWindow.connect("destroy", self.on_mainWindow_destroy) + + rotation_object = FremantleRotation(app_name, mainWindow, app_version, initial_mode) + refreshButton = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, + hildon.BUTTON_ARRANGEMENT_HORIZONTAL, "Actualiser") + refreshButton.connect("clicked", self.on_refreshButton_clicked) + + self.treestore = gtk.TreeStore(str, str) + self.treeview = gtk.TreeView(self.treestore) + + self.tvcolumn_train = gtk.TreeViewColumn('Train', gtk.CellRendererText(), text=0) + self.treeview.append_column(self.tvcolumn_train) + + self.tvcolumn_horaire = gtk.TreeViewColumn('Horaire', gtk.CellRendererText(), text=1) + self.treeview.append_column(self.tvcolumn_horaire) + + + picker_button_source = hildon.PickerButton(gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL) + picker_button_source.set_title("Gare de Depart") + self.combo_source = hildon.TouchSelectorEntry(text=True) + self.combo_dest = hildon.TouchSelectorEntry(text=True) + + for i in ConfFile('example.cfg').get_liste_des_gares(): + self.combo_source.append_text(i[0]) + self.combo_dest.append_text(i[0]) + picker_button_source.set_selector(self.combo_source) + + + picker_button_dest = hildon.PickerButton(gtk.HILDON_SIZE_AUTO, hildon.BUTTON_ARRANGEMENT_VERTICAL) + picker_button_dest.set_title("Gare d'arrivee") + picker_button_dest.set_selector(self.combo_dest) + + vBox = gtk.VBox() + hBox = gtk.HBox() + vBox.pack_start(hBox) + hBox.pack_start(picker_button_source) + hBox.pack_start(picker_button_dest) + vBox.pack_start(self.treeview) + vBox.pack_start(refreshButton) + + + mainWindow.add(vBox) + mainWindow.show_all() + + def on_mainWindow_destroy(self, widget): + gtk.main_quit() + + def on_refreshButton_clicked(self, widget): + gare_source = LongNameGare(self.combo_source.get_current_text()).get_gare(ConfFile('example.cfg')) + gare_dest = LongNameGare(self.combo_dest.get_current_text()).get_gare(ConfFile('example.cfg')) + trajet = Trajet(gare_source , gare_dest) + print trajet + print self.treestore + trajet.refresh_treestore(self.treestore) + + +if __name__ == "__main__": + TransilienUI() + gtk.main() diff --git a/src/opt/masstransit/portrait.py b/src/opt/masstransit/portrait.py new file mode 100644 index 0000000..ce16aa8 --- /dev/null +++ b/src/opt/masstransit/portrait.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +# +# gPodder - A media aggregator and podcast client +# Copyright (c) 2005-2010 Thomas Perl and the gPodder Team +# +# gPodder is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# gPodder is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import dbus +import dbus.glib + +import hildon +import osso + +# Replace this with your own gettext() functionality +import gpodder +_ = gpodder.gettext + + +class FremantleRotation(object): + """thp's screen rotation for Maemo 5 + + Simply instantiate an object of this class and let it auto-rotate + your StackableWindows depending on the device orientation. + + If you need to relayout a window, connect to its "configure-event" + signal and measure the ratio of width/height and relayout for that. + + You can set the mode for rotation to AUTOMATIC (default), NEVER or + ALWAYS with the set_mode() method. + """ + AUTOMATIC, NEVER, ALWAYS = range(3) + + # Human-readable captions for the above constants + MODE_CAPTIONS = (_('Automatic'), _('Landscape'), _('Portrait')) + + # Privately-used constants + _PORTRAIT, _LANDSCAPE = ('portrait', 'landscape') + _ENABLE_ACCEL = 'req_accelerometer_enable' + _DISABLE_ACCEL = 'req_accelerometer_disable' + + # Defined in mce/dbus-names.h + _MCE_SERVICE = 'com.nokia.mce' + _MCE_REQUEST_PATH = '/com/nokia/mce/request' + _MCE_REQUEST_IF = 'com.nokia.mce.request' + + def __init__(self, app_name, main_window=None, version='1.0', mode=0): + """Create a new rotation manager + + app_name ... The name of your application (for osso.Context) + main_window ... The root window (optional, hildon.StackableWindow) + version ... The version of your application (optional, string) + mode ... Initial mode for this manager (default: AUTOMATIC) + """ + self._orientation = None + self._main_window = main_window + self._stack = hildon.WindowStack.get_default() + self._mode = -1 + self._last_dbus_orientation = None + app_id = '-'.join((app_name, self.__class__.__name__)) + self._osso_context = osso.Context(app_id, version, False) + program = hildon.Program.get_instance() + program.connect('notify::is-topmost', self._on_topmost_changed) + system_bus = dbus.Bus.get_system() + system_bus.add_signal_receiver(self._on_orientation_signal, \ + signal_name='sig_device_orientation_ind', \ + dbus_interface='com.nokia.mce.signal', \ + path='/com/nokia/mce/signal') + self.set_mode(mode) + + def get_mode(self): + """Get the currently-set rotation mode + + This will return one of three values: AUTOMATIC, ALWAYS or NEVER. + """ + return self._mode + + def set_mode(self, new_mode): + """Set the rotation mode + + You can set the rotation mode to AUTOMATIC (use hardware rotation + info), ALWAYS (force portrait) and NEVER (force landscape). + """ + if new_mode not in (self.AUTOMATIC, self.ALWAYS, self.NEVER): + raise ValueError('Unknown rotation mode') + + if self._mode != new_mode: + if self._mode == self.AUTOMATIC: + # Remember the current "automatic" orientation for later + self._last_dbus_orientation = self._orientation + # Tell MCE that we don't need the accelerometer anymore + self._send_mce_request(self._DISABLE_ACCEL) + + if new_mode == self.NEVER: + self._orientation_changed(self._LANDSCAPE) + elif new_mode == self.ALWAYS: + self._orientation_changed(self._PORTRAIT) + elif new_mode == self.AUTOMATIC: + # Restore the last-known "automatic" orientation + self._orientation_changed(self._last_dbus_orientation) + # Tell MCE that we need the accelerometer again + self._send_mce_request(self._ENABLE_ACCEL) + + self._mode = new_mode + + def _send_mce_request(self, request): + rpc = osso.Rpc(self._osso_context) + rpc.rpc_run(self._MCE_SERVICE, \ + self._MCE_REQUEST_PATH, \ + self._MCE_REQUEST_IF, \ + request, \ + use_system_bus=True) + + def _on_topmost_changed(self, program, property_spec): + # XXX: This seems to never get called on Fremantle(?) + if self._mode == self.AUTOMATIC: + if program.get_is_topmost(): + self._send_mce_request(self._ENABLE_ACCEL) + else: + self._send_mce_request(self._DISABLE_ACCEL) + + def _get_main_window(self): + if self._main_window: + # If we have gotten the main window as parameter, return it and + # don't try "harder" to find another window using the stack + return self._main_window + else: + # The main window is at the "bottom" of the window stack, and as + # the list we get with get_windows() is sorted "topmost first", we + # simply take the last item of the list to get our main window + windows = self._stack.get_windows() + if windows: + return windows[-1] + else: + return None + + def _orientation_changed(self, orientation): + if self._orientation == orientation: + # Ignore repeated requests + return + + flags = hildon.PORTRAIT_MODE_SUPPORT + if orientation == self._PORTRAIT: + flags |= hildon.PORTRAIT_MODE_REQUEST + + window = self._get_main_window() + if window is not None: + hildon.hildon_gtk_window_set_portrait_flags(window, flags) + + self._orientation = orientation + + def _on_orientation_signal(self, orientation, stand, face, x, y, z): + if orientation in (self._PORTRAIT, self._LANDSCAPE): + if self._mode == self.AUTOMATIC: + # Automatically set the rotation based on hardware orientation + self._orientation_changed(orientation) + else: + # Ignore orientation changes for non-automatic modes, but save + # the current orientation for "automatic" mode later on + self._last_dbus_orientation = orientation + diff --git a/src/portrait.py b/src/portrait.py deleted file mode 100644 index ce16aa8..0000000 --- a/src/portrait.py +++ /dev/null @@ -1,172 +0,0 @@ -# -*- coding: utf-8 -*- -# -# gPodder - A media aggregator and podcast client -# Copyright (c) 2005-2010 Thomas Perl and the gPodder Team -# -# gPodder is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# gPodder is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# - -import dbus -import dbus.glib - -import hildon -import osso - -# Replace this with your own gettext() functionality -import gpodder -_ = gpodder.gettext - - -class FremantleRotation(object): - """thp's screen rotation for Maemo 5 - - Simply instantiate an object of this class and let it auto-rotate - your StackableWindows depending on the device orientation. - - If you need to relayout a window, connect to its "configure-event" - signal and measure the ratio of width/height and relayout for that. - - You can set the mode for rotation to AUTOMATIC (default), NEVER or - ALWAYS with the set_mode() method. - """ - AUTOMATIC, NEVER, ALWAYS = range(3) - - # Human-readable captions for the above constants - MODE_CAPTIONS = (_('Automatic'), _('Landscape'), _('Portrait')) - - # Privately-used constants - _PORTRAIT, _LANDSCAPE = ('portrait', 'landscape') - _ENABLE_ACCEL = 'req_accelerometer_enable' - _DISABLE_ACCEL = 'req_accelerometer_disable' - - # Defined in mce/dbus-names.h - _MCE_SERVICE = 'com.nokia.mce' - _MCE_REQUEST_PATH = '/com/nokia/mce/request' - _MCE_REQUEST_IF = 'com.nokia.mce.request' - - def __init__(self, app_name, main_window=None, version='1.0', mode=0): - """Create a new rotation manager - - app_name ... The name of your application (for osso.Context) - main_window ... The root window (optional, hildon.StackableWindow) - version ... The version of your application (optional, string) - mode ... Initial mode for this manager (default: AUTOMATIC) - """ - self._orientation = None - self._main_window = main_window - self._stack = hildon.WindowStack.get_default() - self._mode = -1 - self._last_dbus_orientation = None - app_id = '-'.join((app_name, self.__class__.__name__)) - self._osso_context = osso.Context(app_id, version, False) - program = hildon.Program.get_instance() - program.connect('notify::is-topmost', self._on_topmost_changed) - system_bus = dbus.Bus.get_system() - system_bus.add_signal_receiver(self._on_orientation_signal, \ - signal_name='sig_device_orientation_ind', \ - dbus_interface='com.nokia.mce.signal', \ - path='/com/nokia/mce/signal') - self.set_mode(mode) - - def get_mode(self): - """Get the currently-set rotation mode - - This will return one of three values: AUTOMATIC, ALWAYS or NEVER. - """ - return self._mode - - def set_mode(self, new_mode): - """Set the rotation mode - - You can set the rotation mode to AUTOMATIC (use hardware rotation - info), ALWAYS (force portrait) and NEVER (force landscape). - """ - if new_mode not in (self.AUTOMATIC, self.ALWAYS, self.NEVER): - raise ValueError('Unknown rotation mode') - - if self._mode != new_mode: - if self._mode == self.AUTOMATIC: - # Remember the current "automatic" orientation for later - self._last_dbus_orientation = self._orientation - # Tell MCE that we don't need the accelerometer anymore - self._send_mce_request(self._DISABLE_ACCEL) - - if new_mode == self.NEVER: - self._orientation_changed(self._LANDSCAPE) - elif new_mode == self.ALWAYS: - self._orientation_changed(self._PORTRAIT) - elif new_mode == self.AUTOMATIC: - # Restore the last-known "automatic" orientation - self._orientation_changed(self._last_dbus_orientation) - # Tell MCE that we need the accelerometer again - self._send_mce_request(self._ENABLE_ACCEL) - - self._mode = new_mode - - def _send_mce_request(self, request): - rpc = osso.Rpc(self._osso_context) - rpc.rpc_run(self._MCE_SERVICE, \ - self._MCE_REQUEST_PATH, \ - self._MCE_REQUEST_IF, \ - request, \ - use_system_bus=True) - - def _on_topmost_changed(self, program, property_spec): - # XXX: This seems to never get called on Fremantle(?) - if self._mode == self.AUTOMATIC: - if program.get_is_topmost(): - self._send_mce_request(self._ENABLE_ACCEL) - else: - self._send_mce_request(self._DISABLE_ACCEL) - - def _get_main_window(self): - if self._main_window: - # If we have gotten the main window as parameter, return it and - # don't try "harder" to find another window using the stack - return self._main_window - else: - # The main window is at the "bottom" of the window stack, and as - # the list we get with get_windows() is sorted "topmost first", we - # simply take the last item of the list to get our main window - windows = self._stack.get_windows() - if windows: - return windows[-1] - else: - return None - - def _orientation_changed(self, orientation): - if self._orientation == orientation: - # Ignore repeated requests - return - - flags = hildon.PORTRAIT_MODE_SUPPORT - if orientation == self._PORTRAIT: - flags |= hildon.PORTRAIT_MODE_REQUEST - - window = self._get_main_window() - if window is not None: - hildon.hildon_gtk_window_set_portrait_flags(window, flags) - - self._orientation = orientation - - def _on_orientation_signal(self, orientation, stand, face, x, y, z): - if orientation in (self._PORTRAIT, self._LANDSCAPE): - if self._mode == self.AUTOMATIC: - # Automatically set the rotation based on hardware orientation - self._orientation_changed(orientation) - else: - # Ignore orientation changes for non-automatic modes, but save - # the current orientation for "automatic" mode later on - self._last_dbus_orientation = orientation - diff --git a/src/usr/share/applications/hildon/masstransit.desktop b/src/usr/share/applications/hildon/masstransit.desktop new file mode 100644 index 0000000..2d1c519 --- /dev/null +++ b/src/usr/share/applications/hildon/masstransit.desktop @@ -0,0 +1,13 @@ + [Desktop Entry] + Version=1.0.0 + Encoding=UTF-8 + Name=masstransit + Comment=Horaires de rer + Exec=/opt/masstransit/masstransit.py + Icon=masstransit + X-Icon-path=/usr/share/icons + X-Window-Icon=masstransit + Type=Application +# X-Osso-Service=com.nokia.masstransit + X-Osso-Type=application/x-executable +# StartupWMClass=mClock Only needed because it's a PyGame app (would be automatic with GTK)