- work on actions
authorFelix Domke <tmbinc@elitedvb.net>
Fri, 25 Feb 2005 01:46:44 +0000 (01:46 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Fri, 25 Feb 2005 01:46:44 +0000 (01:46 +0000)
 - changed time when screens are acutally constructed
 - added service name (not working atm) and event info (now&next)

30 files changed:
components.py
configure.ac
keyids.py [new file with mode: 0644]
keymap.xml [new file with mode: 0644]
keymapparser.py [new file with mode: 0644]
lib/Makefile.am
lib/base/smartptr.h
lib/components/scan.cpp
lib/components/scan.h
lib/driver/rcconsole.cpp
lib/dvb/scan.cpp
lib/dvb/scan.h
lib/gui/elistbox.cpp
lib/gui/elistbox.h
lib/gui/ewidget.h
lib/gui/ewindowstyle.cpp
lib/nav/core.cpp
lib/nav/core.h
lib/nav/pcore.cpp
lib/nav/pcore.h
lib/python/enigma_python.i
lib/service/event.h
lib/service/iservice.h
lib/service/servicedvb.cpp
lib/service/servicedvb.h
main/Makefile.am
main/enigma.cpp
mytest.py
screens.py
skin.py

index 63e5669e9e0e59af5ade944c976ecfe1b7c996a8..219e4f52948f1ae8c637eef00c509f3342e61b50 100644 (file)
@@ -86,7 +86,13 @@ class GUIComponent:
 
        def __init__(self):
                pass
 
        def __init__(self):
                pass
+               
+       def execBegin(self):
+               pass
        
        
+       def execEnd(self):
+               pass
+
 class VariableText:
        """VariableText can be used for components which have a variable text, based on any widget with setText call"""
        
 class VariableText:
        """VariableText can be used for components which have a variable text, based on any widget with setText call"""
        
@@ -322,4 +328,94 @@ class ServiceScan:
 
        def fix(self):
                self.scan.statusChanged.get().remove(self.scanStatusChanged)
 
        def fix(self):
                self.scan.statusChanged.get().remove(self.scanStatusChanged)
-       
\ No newline at end of file
+       
+class ActionMap:
+       def __init__(self, context, actions = { }, prio=0):
+               self.actions = actions
+               self.context = context
+               self.prio = prio
+               self.p = eActionMapPtr()
+               eActionMap.getInstance(self.p)
+
+       def execBegin(self):
+               self.p.bindAction(self.context, self.prio, self.action)
+       
+       def execEnd(self):
+               self.p.unbindAction(self.context, self.action)
+       
+       def action(self, context, action):
+               try:
+                       self.actions[action]()
+               except KeyError:
+                       print "unknown action %s/%s! typo in keymap?" % (context, action)
+
+class PerServiceDisplay(GUIComponent, VariableText):
+       """Mixin for building components which display something which changes on navigation events, for example "service name" """
+       
+       def __init__(self, navcore, eventmap):
+               GUIComponent.__init__(self)
+               VariableText.__init__(self)
+               self.eventmap = eventmap
+               navcore.m_event.get().append(self.event)
+               self.navcore = navcore
+
+               # start with stopped state, so simulate that
+               self.event(pNavigation.evStopService)
+
+       def event(self, ev):
+               # loop up if we need to handle this event
+               if self.eventmap.has_key(ev):
+                       # call handler
+                       self.eventmap[ev]()
+       
+       def createWidget(self, parent, skindata):
+               # by default, we use a label to display our data.
+               g = eLabel(parent)
+               return g
+
+class EventInfo(PerServiceDisplay):
+       Now = 0
+       Next = 1
+       def __init__(self, navcore, now_or_next):
+               # listen to evUpdatedEventInfo and evStopService
+               # note that evStopService will be called once to establish a known state
+               PerServiceDisplay.__init__(self, navcore, 
+                       { 
+                               pNavigation.evUpdatedEventInfo: self.ourEvent, 
+                               pNavigation.evStopService: self.stopEvent 
+                       })
+               self.now_or_next = now_or_next
+
+       def ourEvent(self):
+               info = iServiceInformationPtr()
+               service = iPlayableServicePtr()
+               
+               if not self.navcore.getCurrentService(service):
+                       if not service.info(info):
+                               print "got info !"
+                               ev = eServiceEventPtr()
+                               info.getEvent(ev, self.now_or_next)
+                               self.setText(ev.m_event_name)
+               print "new event info in EventInfo! yeah!"
+
+       def stopEvent(self):
+                       self.setText("waiting for event data...");
+
+class ServiceName(PerServiceDisplay):
+       def __init__(self, navcore):
+               PerServiceDisplay.__init__(self, navcore,
+                       {
+                               pNavigation.evNewService: self.newService,
+                               pNavigation.evStopService: self.stopEvent
+                       })
+
+       def newService(self):
+               info = iServiceInformationPtr()
+               service = iPlayableServicePtr()
+               
+               if not self.navcore.getCurrentService(service):
+                       if not service.info(info):
+                               self.setText("no name known, but it should be here :)")
+       
+       def stopEvent(self):
+                       self.setText("");
index ca7a7064a6f211edab3cabecc44d8655606cb6f7..3b67b4cebecc74ac7f0058d5ad3e7be13daa4d18 100644 (file)
@@ -29,6 +29,7 @@ TUXBOX_APPS_GETTEXT
 AC_OUTPUT([
 Makefile
 lib/Makefile
 AC_OUTPUT([
 Makefile
 lib/Makefile
+lib/actions/Makefile
 lib/base/Makefile
 lib/driver/Makefile
 lib/dvb/Makefile
 lib/base/Makefile
 lib/driver/Makefile
 lib/dvb/Makefile
diff --git a/keyids.py b/keyids.py
new file mode 100644 (file)
index 0000000..fab9345
--- /dev/null
+++ b/keyids.py
@@ -0,0 +1,297 @@
+KEYIDS = { 
+"KEY_RESERVED": 0, 
+"KEY_ESC": 1, 
+"KEY_1": 2, 
+"KEY_2": 3, 
+"KEY_3": 4, 
+"KEY_4": 5, 
+"KEY_5": 6, 
+"KEY_6": 7, 
+"KEY_7": 8, 
+"KEY_8": 9, 
+"KEY_9": 10, 
+"KEY_0": 11, 
+"KEY_MINUS": 12, 
+"KEY_EQUAL": 13, 
+"KEY_BACKSPACE": 14, 
+"KEY_TAB": 15, 
+"KEY_Q": 16, 
+"KEY_W": 17, 
+"KEY_E": 18, 
+"KEY_R": 19, 
+"KEY_T": 20, 
+"KEY_Y": 21, 
+"KEY_U": 22, 
+"KEY_I": 23, 
+"KEY_O": 24, 
+"KEY_P": 25, 
+"KEY_LEFTBRACE": 26, 
+"KEY_RIGHTBRACE": 27, 
+"KEY_ENTER": 28, 
+"KEY_LEFTCTRL": 29, 
+"KEY_A": 30, 
+"KEY_S": 31, 
+"KEY_D": 32, 
+"KEY_F": 33, 
+"KEY_G": 34, 
+"KEY_H": 35, 
+"KEY_J": 36, 
+"KEY_K": 37, 
+"KEY_L": 38, 
+"KEY_SEMICOLON": 39, 
+"KEY_APOSTROPHE": 40, 
+"KEY_GRAVE": 41, 
+"KEY_LEFTSHIFT": 42, 
+"KEY_BACKSLASH": 43, 
+"KEY_Z": 44, 
+"KEY_X": 45, 
+"KEY_C": 46, 
+"KEY_V": 47, 
+"KEY_B": 48, 
+"KEY_N": 49, 
+"KEY_M": 50, 
+"KEY_COMMA": 51, 
+"KEY_DOT": 52, 
+"KEY_SLASH": 53, 
+"KEY_RIGHTSHIFT": 54, 
+"KEY_KPASTERISK": 55, 
+"KEY_LEFTALT": 56, 
+"KEY_SPACE": 57, 
+"KEY_CAPSLOCK": 58, 
+"KEY_F1": 59, 
+"KEY_F2": 60, 
+"KEY_F3": 61, 
+"KEY_F4": 62, 
+"KEY_F5": 63, 
+"KEY_F6": 64, 
+"KEY_F7": 65, 
+"KEY_F8": 66, 
+"KEY_F9": 67, 
+"KEY_F10": 68, 
+"KEY_NUMLOCK": 69, 
+"KEY_SCROLLLOCK": 70, 
+"KEY_KP7": 71, 
+"KEY_KP8": 72, 
+"KEY_KP9": 73, 
+"KEY_KPMINUS": 74, 
+"KEY_KP4": 75, 
+"KEY_KP5": 76, 
+"KEY_KP6": 77, 
+"KEY_KPPLUS": 78, 
+"KEY_KP1": 79, 
+"KEY_KP2": 80, 
+"KEY_KP3": 81, 
+"KEY_KP0": 82, 
+"KEY_KPDOT": 83, 
+"KEY_103RD": 84, 
+"KEY_F13": 85, 
+"KEY_102ND": 86, 
+"KEY_F11": 87, 
+"KEY_F12": 88, 
+"KEY_F14": 89, 
+"KEY_F15": 90, 
+"KEY_F16": 91, 
+"KEY_F17": 92, 
+"KEY_F18": 93, 
+"KEY_F19": 94, 
+"KEY_F20": 95, 
+"KEY_KPENTER": 96, 
+"KEY_RIGHTCTRL": 97, 
+"KEY_KPSLASH": 98, 
+"KEY_SYSRQ": 99, 
+"KEY_RIGHTALT": 100, 
+"KEY_LINEFEED": 101, 
+"KEY_HOME": 102, 
+"KEY_UP": 103, 
+"KEY_PAGEUP": 104, 
+"KEY_LEFT": 105, 
+"KEY_RIGHT": 106, 
+"KEY_END": 107, 
+"KEY_DOWN": 108, 
+"KEY_PAGEDOWN": 109, 
+"KEY_INSERT": 110, 
+"KEY_DELETE": 111, 
+"KEY_MACRO": 112, 
+"KEY_MUTE": 113, 
+"KEY_VOLUMEDOWN": 114, 
+"KEY_VOLUMEUP": 115, 
+"KEY_POWER": 116, 
+"KEY_KPEQUAL": 117, 
+"KEY_KPPLUSMINUS": 118, 
+"KEY_PAUSE": 119, 
+"KEY_F21": 120, 
+"KEY_F22": 121, 
+"KEY_F23": 122, 
+"KEY_F24": 123, 
+"KEY_KPCOMMA": 124, 
+"KEY_LEFTMETA": 125, 
+"KEY_RIGHTMETA": 126, 
+"KEY_COMPOSE": 127, 
+"KEY_STOP": 128, 
+"KEY_AGAIN": 129, 
+"KEY_PROPS": 130, 
+"KEY_UNDO": 131, 
+"KEY_FRONT": 132, 
+"KEY_COPY": 133, 
+"KEY_OPEN": 134, 
+"KEY_PASTE": 135, 
+"KEY_FIND": 136, 
+"KEY_CUT": 137, 
+"KEY_HELP": 138, 
+"KEY_MENU": 139, 
+"KEY_CALC": 140, 
+"KEY_SETUP": 141, 
+"KEY_SLEEP": 142, 
+"KEY_WAKEUP": 143, 
+"KEY_FILE": 144, 
+"KEY_SENDFILE": 145, 
+"KEY_DELETEFILE": 146, 
+"KEY_XFER": 147, 
+"KEY_PROG1": 148, 
+"KEY_PROG2": 149, 
+"KEY_WWW": 150, 
+"KEY_MSDOS": 151, 
+"KEY_COFFEE": 152, 
+"KEY_DIRECTION": 153, 
+"KEY_CYCLEWINDOWS": 154, 
+"KEY_MAIL": 155, 
+"KEY_BOOKMARKS": 156, 
+"KEY_COMPUTER": 157, 
+"KEY_BACK": 158, 
+"KEY_FORWARD": 159, 
+"KEY_CLOSECD": 160, 
+"KEY_EJECTCD": 161, 
+"KEY_EJECTCLOSECD": 162, 
+"KEY_NEXTSONG": 163, 
+"KEY_PLAYPAUSE": 164, 
+"KEY_PREVIOUSSONG": 165, 
+"KEY_STOPCD": 166, 
+"KEY_RECORD": 167, 
+"KEY_REWIND": 168, 
+"KEY_PHONE": 169, 
+"KEY_ISO": 170, 
+"KEY_CONFIG": 171, 
+"KEY_HOMEPAGE": 172, 
+"KEY_REFRESH": 173, 
+"KEY_EXIT": 174, 
+"KEY_MOVE": 175, 
+"KEY_EDIT": 176, 
+"KEY_SCROLLUP": 177, 
+"KEY_SCROLLDOWN": 178, 
+"KEY_KPLEFTPAREN": 179, 
+"KEY_KPRIGHTPAREN": 180, 
+"KEY_INTL1": 181, 
+"KEY_INTL2": 182, 
+"KEY_INTL3": 183, 
+"KEY_INTL4": 184, 
+"KEY_INTL5": 185, 
+"KEY_INTL6": 186, 
+"KEY_INTL7": 187, 
+"KEY_INTL8": 188, 
+"KEY_INTL9": 189, 
+"KEY_LANG1": 190, 
+"KEY_LANG2": 191, 
+"KEY_LANG3": 192, 
+"KEY_LANG4": 193, 
+"KEY_LANG5": 194, 
+"KEY_LANG6": 195, 
+"KEY_LANG7": 196, 
+"KEY_LANG8": 197, 
+"KEY_LANG9": 198, 
+"KEY_PLAYCD": 200, 
+"KEY_PAUSECD": 201, 
+"KEY_PROG3": 202, 
+"KEY_PROG4": 203, 
+"KEY_SUSPEND": 205, 
+"KEY_CLOSE": 206, 
+"KEY_PLAY": 207, 
+"KEY_FASTFORWARD": 208, 
+"KEY_BASSBOOST": 209, 
+"KEY_PRINT": 210, 
+"KEY_HP": 211, 
+"KEY_CAMERA": 212, 
+"KEY_SOUND": 213, 
+"KEY_QUESTION": 214, 
+"KEY_EMAIL": 215, 
+"KEY_CHAT": 216, 
+"KEY_SEARCH": 217, 
+"KEY_CONNECT": 218, 
+"KEY_FINANCE": 219, 
+"KEY_SPORT": 220, 
+"KEY_SHOP": 221, 
+"KEY_ALTERASE": 222, 
+"KEY_CANCEL": 223, 
+"KEY_BRIGHTNESSDOWN": 224, 
+"KEY_BRIGHTNESSUP": 225, 
+"KEY_MEDIA": 226, 
+"KEY_UNKNOWN": 240, 
+"KEY_OK": 352, 
+"KEY_SELECT": 353, 
+"KEY_GOTO": 354, 
+"KEY_CLEAR": 355, 
+"KEY_POWER2": 356, 
+"KEY_OPTION": 357, 
+"KEY_INFO": 358, 
+"KEY_TIME": 359, 
+"KEY_VENDOR": 360, 
+"KEY_ARCHIVE": 361, 
+"KEY_PROGRAM": 362, 
+"KEY_CHANNEL": 363, 
+"KEY_FAVORITES": 364, 
+"KEY_EPG": 365, 
+"KEY_PVR": 366, 
+"KEY_MHP": 367, 
+"KEY_LANGUAGE": 368, 
+"KEY_TITLE": 369, 
+"KEY_SUBTITLE": 370, 
+"KEY_ANGLE": 371, 
+"KEY_ZOOM": 372, 
+"KEY_MODE": 373, 
+"KEY_KEYBOARD": 374, 
+"KEY_SCREEN": 375, 
+"KEY_PC": 376, 
+"KEY_TV": 377, 
+"KEY_TV2": 378, 
+"KEY_VCR": 379, 
+"KEY_VCR2": 380, 
+"KEY_SAT": 381, 
+"KEY_SAT2": 382, 
+"KEY_CD": 383, 
+"KEY_TAPE": 384, 
+"KEY_RADIO": 385, 
+"KEY_TUNER": 386, 
+"KEY_PLAYER": 387, 
+"KEY_TEXT": 388, 
+"KEY_DVD": 389, 
+"KEY_AUX": 390, 
+"KEY_MP3": 391, 
+"KEY_AUDIO": 392, 
+"KEY_VIDEO": 393, 
+"KEY_DIRECTORY": 394, 
+"KEY_LIST": 395, 
+"KEY_MEMO": 396, 
+"KEY_CALENDAR": 397, 
+"KEY_RED": 398, 
+"KEY_GREEN": 399, 
+"KEY_YELLOW": 400, 
+"KEY_BLUE": 401, 
+"KEY_CHANNELUP": 402, 
+"KEY_CHANNELDOWN": 403, 
+"KEY_FIRST": 404, 
+"KEY_LAST": 405, 
+"KEY_AB": 406, 
+"KEY_NEXT": 407, 
+"KEY_RESTART": 408, 
+"KEY_SLOW": 409, 
+"KEY_SHUFFLE": 410, 
+"KEY_BREAK": 411, 
+"KEY_PREVIOUS": 412, 
+"KEY_DIGITS": 413, 
+"KEY_TEEN": 414, 
+"KEY_TWEN": 415, 
+"KEY_DEL_EOL": 448, 
+"KEY_DEL_EOS": 449, 
+"KEY_INS_LINE": 450, 
+"KEY_DEL_LINE": 451, 
+"KEY_MAX": 511, 
+}
diff --git a/keymap.xml b/keymap.xml
new file mode 100644 (file)
index 0000000..a17aebb
--- /dev/null
@@ -0,0 +1,26 @@
+<keymap>
+       <map context="ListboxActions">
+               <device name="keyboard">
+                       <key id="a" mapto="up" flags="mr" />
+                       <key id="b" mapto="down" flags="mr" />
+               </device>
+               <key id="KEY_UP" mapto="up" flags="mr" />
+               <key id="KEY_DOWN" mapto="down" flags="mr" />
+               <key id="1" mapto="moveUp" flags="mr" />
+               <key id="2" mapto="moveDown" flags="mr" />
+       </map>
+       <map context="InfobarActions">
+               <key id="m" mapto="mainMenu" flags="mr" />
+               <key id="c" mapto="switchChannel" flags="mr" />
+       </map>
+       <map context="MainMenuActions">
+               <key id=" " mapto="selected" flags="mr" />
+       </map>
+       
+       <map context="ChannelSelectActions">
+               <key id=" " mapto="selectChannel" flags="mr" />
+       </map>
+       <map context="WindowActions">
+               
+       </map>
+</keymap>
diff --git a/keymapparser.py b/keymapparser.py
new file mode 100644 (file)
index 0000000..510a47a
--- /dev/null
@@ -0,0 +1,68 @@
+import xml.dom.minidom
+import enigma
+
+from keyids import KEYIDS;
+
+def readKeymap():
+
+       p = enigma.eActionMapPtr()
+       enigma.eActionMap.getInstance(p)
+       assert p
+       
+       filename = "keymap.xml"
+       
+       try:
+               source = open(filename)
+       except:
+               raise "couldn't open keymap.xml!"
+       
+       try:
+               dom = xml.dom.minidom.parse(source)
+       except:
+               raise "keymap not well-formed."
+       
+       try:    
+               keymap = dom.getElementsByTagName("keymap")[0]
+       except:
+               raise "no keymap defined."
+       
+       maps = keymap.getElementsByTagName("map")
+       
+       for cmap in maps:
+               context = str(cmap.getAttribute("context"))
+               assert context != "", "map must have context"
+       
+               def parseKeys(device, keys):
+                       for x in keys.getElementsByTagName("key"):
+                               mapto = str(x.getAttribute("mapto"))
+                               id = x.getAttribute("id")
+                               flags = x.getAttribute("flags")
+                               
+                               flag_ascii_to_id = lambda x: {'m':1,'r':2,'b':4}[x]
+                               
+#                              try:
+                               flags = sum(map(flag_ascii_to_id, flags))
+                               print "-> " + str(flags)
+#                              except:
+#                                      raise str("%s: illegal flags '%s' specificed in context %s, id '%s'" % (filename, flags, context, id))
+                               
+                               assert mapto != "", "%s: must specify mapto in context %s, id '%s'" % (filename, context, id)
+                               assert id != "", "%s: must specify id in context %s, mapto '%s'" % (filename, context, mapto)
+                               assert flags != 0, "%s: must specify at least one flag in context %s, id '%s'" % (filename, context, id)
+                               
+                               if len(id) == 1:
+                                       keyid = ord(id) | 0x8000
+                               else:
+                                       try:
+                                               keyid = KEYIDS[id]
+                                       except:
+                                               raise "key id '" + str(id) + "' is illegal"
+
+                               print context + "::" + mapto + " -> " + device + "." + hex(keyid)
+                               p.bindKey(device, keyid, 7, context, mapto)
+               
+               parseKeys("generic", cmap)
+               
+               for device in cmap.getElementsByTagName("device"):
+                       parseKeys(str(device.getAttribute("name")), device)
+
index 72efc4018b02a24a98b9005cc4a7d64887f6e7a8..72679b6862765d4e39eeefacef05c4622b59009a 100644 (file)
@@ -1 +1 @@
-SUBDIRS = base dvb dvb_si gdi network service driver nav gui python components
+SUBDIRS = actions base components dvb dvb_si gdi network service driver nav gui python
index 906bba69e8fb49922f033977a7278b15b6c6c72d..159eeb2c0122ff43fa16786fb7dd787c20eaeb62 100644 (file)
@@ -4,6 +4,14 @@
 #include "object.h"
 #include <stdio.h>
 
 #include "object.h"
 #include <stdio.h>
 
+#ifdef SWIG
+#define TEMPLATE_TYPEDEF(x, y) \
+%template(y) x; \
+typedef x y
+#else
+#define TEMPLATE_TYPEDEF(x, y) typedef x y
+#endif
+
 template<class T>
 class ePtr
 {
 template<class T>
 class ePtr
 {
index 4d8d8b782c570ffd68483b6501ab982c9d9fc09f..8fb60b5863237ba81fe3b932597b539715fab42b 100644 (file)
@@ -20,23 +20,29 @@ void eComponentScan::scanEvent(int evt)
                if ((err = eDVBResourceManager::getInstance(res)) != 0)
                {
                        eDebug("no resource manager");
                if ((err = eDVBResourceManager::getInstance(res)) != 0)
                {
                        eDebug("no resource manager");
-                       return;
-               }
-               if ((err = res->getChannelList(db)) != 0)
+                       m_failed = 2;
+               } else if ((err = res->getChannelList(db)) != 0)
                {
                {
+                       m_failed = 3;
                        eDebug("no channel list");
                        eDebug("no channel list");
-                       return;
+               } else
+               {
+                       m_scan->insertInto(db);
+                       eDebug("scan done!");
                }
                }
-               
-               m_scan->insertInto(db);
-               
-               eDebug("scan done!");
+       }
+       
+       if (evt == eDVBScan::evtFail)
+       {
+               eDebug("scan failed.");
+               m_failed = 1;
+               m_done = 1;
        }
        
        statusChanged();
 }
 
        }
        
        statusChanged();
 }
 
-eComponentScan::eComponentScan(): m_done(-1)
+eComponentScan::eComponentScan(): m_done(-1), m_failed(0)
 {
 }
 
 {
 }
 
@@ -77,8 +83,8 @@ int eComponentScan::start()
        list.push_back(fe);
        
        m_scan = new eDVBScan(channel);
        list.push_back(fe);
        
        m_scan = new eDVBScan(channel);
-       m_scan->start(list);
        m_scan->connectEvent(slot(*this, &eComponentScan::scanEvent), m_scan_event_connection);
        m_scan->connectEvent(slot(*this, &eComponentScan::scanEvent), m_scan_event_connection);
+       m_scan->start(list);
 
        return 0;
 }
 
        return 0;
 }
index afa68689b180bfa7446d64d36c31a82a26c7fc31..073919c7da11e848e478515369d33447ee71df47 100644 (file)
@@ -13,7 +13,7 @@ private:
        ePtr<eConnection> m_scan_event_connection;
        ePtr<eDVBScan> m_scan;
        
        ePtr<eConnection> m_scan_event_connection;
        ePtr<eDVBScan> m_scan;
        
-       int m_done;
+       int m_done, m_failed;
 public:
        eComponentScan();
        ~eComponentScan();
 public:
        eComponentScan();
        ~eComponentScan();
index f662b2b146bd27361e87efab08842463e6495586..3b5397b1b42f4456d65bdf02539c3328cf4d5d8c 100644 (file)
@@ -78,7 +78,7 @@ void eRCConsoleDriver::keyPressed(int)
 #endif
                if (code != -1)
                        for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
 #endif
                if (code != -1)
                        for (std::list<eRCDevice*>::iterator i(listeners.begin()); i!=listeners.end(); ++i)
-                               (*i)->handleCode(code);
+                               (*i)->handleCode(code | 0x8000);
        }
 }
 
        }
 }
 
index 65eb053c39c63fb585e0f54a36011244b5f01ac1..b6d0575bfafd32720ac6c0beb0880a143a9d6a4c 100644 (file)
@@ -96,11 +96,17 @@ RESULT eDVBScan::nextChannel()
        m_ch_toScan.pop_front();
        
        if (m_channel->getFrontend(fe))
        m_ch_toScan.pop_front();
        
        if (m_channel->getFrontend(fe))
+       {
+               m_event(evtFail);
                return -ENOTSUP;
                return -ENOTSUP;
+       }
        
        m_channel_state = iDVBChannel::state_idle;
        if (fe->tune(*m_ch_current))
        
        m_channel_state = iDVBChannel::state_idle;
        if (fe->tune(*m_ch_current))
+       {
+               m_event(evtFail);
                return -EINVAL;
                return -EINVAL;
+       }
                
        m_event(evtUpdate);
        return 0;
                
        m_event(evtUpdate);
        return 0;
index 3556eb20774937e80c2664286ec3a339977ed4b0..96264e887b73798568e3170e33f2c68639c1b347 100644 (file)
@@ -65,7 +65,7 @@ public:
        
        void start(const std::list<ePtr<iDVBFrontendParameters> > &known_transponders);
 
        
        void start(const std::list<ePtr<iDVBFrontendParameters> > &known_transponders);
 
-       enum { evtUpdate, evtFinish };
+       enum { evtUpdate, evtFinish, evtFail };
   RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
        void insertInto(iDVBChannelList *db);
        
   RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);
        void insertInto(iDVBChannelList *db);
        
index 361d7b99427314e27d5d51c4fbbb57015e9c35ea..1dae137fdab5b0f99b0498fade511e0d9ad6fe32 100644 (file)
@@ -1,9 +1,22 @@
 #include <lib/gui/elistbox.h>
 #include <lib/gui/elistboxcontent.h>
 #include <lib/gui/elistbox.h>
 #include <lib/gui/elistboxcontent.h>
+#include <lib/actions/action.h>
 
 eListbox::eListbox(eWidget *parent): eWidget(parent)
 {
        setContent(new eListboxStringContent());
 
 eListbox::eListbox(eWidget *parent): eWidget(parent)
 {
        setContent(new eListboxStringContent());
+
+       ePtr<eActionMap> ptr;
+       eActionMap::getInstance(ptr);
+       
+       ptr->bindAction("ListboxActions", 0, 0, this);
+}
+
+eListbox::~eListbox()
+{
+       ePtr<eActionMap> ptr;
+       eActionMap::getInstance(ptr);
+       ptr->unbindAction(this, 0);
 }
 
 void eListbox::setContent(iListboxContent *content)
 }
 
 void eListbox::setContent(iListboxContent *content)
@@ -108,6 +121,9 @@ int eListbox::event(int event, void *data, void *data2)
                
                return 0;
        }
                
                return 0;
        }
+       case evtAction:
+               moveSelection((int)data2);
+               return 1;
        default:
                return eWidget::event(event, data, data2);
        }
        default:
                return eWidget::event(event, data, data2);
        }
index 9ec94665317d9f550473fe2d1dcda3d82807a745..78e0fbe9d5ee57ceb2f3a8e2916ee5bee492e25a 100644 (file)
@@ -50,14 +50,26 @@ class eListbox: public eWidget
 {
 public:
        eListbox(eWidget *parent);
 {
 public:
        eListbox(eWidget *parent);
+       ~eListbox();
        void setContent(iListboxContent *content);
        
        void setContent(iListboxContent *content);
        
+/*     enum Movement {
+               moveUp,
+               moveDown,
+               moveTop,
+               moveEnd,
+               justCheck
+       }; */
+       
        void moveSelection(int how);
        void moveSelection(int how);
-       enum {
+
+       enum ListboxActions {
                moveUp,
                moveDown,
                moveTop,
                moveEnd,
                moveUp,
                moveDown,
                moveTop,
                moveEnd,
+               pageUp,
+               pageDown,
                justCheck
        };
 protected:
                justCheck
        };
 protected:
index fa8cd8cac1b37d163f93f74541c5943c920713c3..12d2e743942143604eaf1a31192273ba81cb1c88 100644 (file)
@@ -73,6 +73,8 @@ public:
                evtWillChangePosition, /* new size is eRect *data */
                evtWillChangeSize,
                
                evtWillChangePosition, /* new size is eRect *data */
                evtWillChangeSize,
                
+               evtAction,
+               
                evtUserWidget,
        };
        virtual int event(int event, void *data = 0, void *data2 = 0);
                evtUserWidget,
        };
        virtual int event(int event, void *data = 0, void *data2 = 0);
index a5ace37ae8b5413b85b03f0af5a3288cb6ab5de2..ccf7299f95ca45af6fb17539bddf7b2ed7bc236d 100644 (file)
@@ -10,16 +10,16 @@ DEFINE_REF(eWindowStyleSimple);
 
 eWindowStyleSimple::eWindowStyleSimple()
 {
 
 eWindowStyleSimple::eWindowStyleSimple()
 {
-       m_border_left = m_border_right = m_border_bottom = 1;
+       m_border_left = m_border_right = m_border_bottom = 2;
        m_border_top = 30;
 
        m_fnt = new gFont("Arial", 25);
        
        m_border_top = 30;
 
        m_fnt = new gFont("Arial", 25);
        
-       m_border_color_tl = gColor(0x14);
-       m_border_color_br = gColor(0x1c);
+       m_border_color_tl = gColor(0x1f);
+       m_border_color_br = gColor(0x14);
        m_title_color_back = gColor(0x20);
        m_title_color = gColor(0x2f);
        m_title_color_back = gColor(0x20);
        m_title_color = gColor(0x2f);
-       m_background_color = gColor(0x18);
+       m_background_color = gColor(0x19);
 }
 
 void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size)
 }
 
 void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size)
@@ -36,19 +36,27 @@ void eWindowStyleSimple::handleNewSize(eWindow *wnd, const eSize &size)
 
 void eWindowStyleSimple::paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title)
 {
 
 void eWindowStyleSimple::paintWindowDecoration(eWindow *wnd, gPainter &painter, const std::string &title)
 {
+       painter.setForegroundColor(m_title_color_back);
+       painter.fill(eRect(2, 2, wnd->size().width() - 4, m_border_top - 4));
        painter.setBackgroundColor(m_title_color_back);
        painter.setForegroundColor(m_title_color);
        painter.setBackgroundColor(m_title_color_back);
        painter.setForegroundColor(m_title_color);
-       painter.clear();
        painter.setFont(m_fnt);
        painter.setFont(m_fnt);
-       painter.renderText(eRect(1, 1, wnd->size().width() - 2, m_border_top - 2), title);
+       painter.renderText(eRect(3, 3, wnd->size().width() - 6, m_border_top - 6), title);
 
        eRect frame(ePoint(0, 0), wnd->size());
 
        eRect frame(ePoint(0, 0), wnd->size());
-       painter.setForegroundColor(m_border_color_tl);
+
+       painter.setForegroundColor(m_background_color);
        painter.line(frame.topLeft1(), frame.topRight1());
        painter.line(frame.topLeft1(), frame.topRight1());
-       painter.line(frame.topRight1(), frame.bottomRight1());
+       painter.line(frame.topLeft1(), frame.bottomLeft1());
+       painter.setForegroundColor(m_border_color_tl);
+       painter.line(frame.topLeft1()+eSize(1,1), frame.topRight1()+eSize(0,1));
+       painter.line(frame.topLeft1()+eSize(1,1), frame.bottomLeft1()+eSize(1,0));
+
        painter.setForegroundColor(m_border_color_br);
        painter.setForegroundColor(m_border_color_br);
-       painter.line(frame.bottomRight1(), frame.bottomLeft1());
-       painter.line(frame.bottomLeft1(), frame.topLeft1());
+       painter.line(frame.bottomLeft()+eSize(1,-1), frame.bottomRight()+eSize(0,-1));
+       painter.line(frame.topRight1()+eSize(-1,1), frame.bottomRight1()+eSize(-1, 0));
+       painter.line(frame.bottomLeft()+eSize(1,-2), frame.bottomRight()+eSize(0,-2));
+       painter.line(frame.topRight1()+eSize(-0,1), frame.bottomRight1()+eSize(-0, 0));
 }
 
 void eWindowStyleSimple::paintBackground(gPainter &painter, const ePoint &offset, const eSize &size)
 }
 
 void eWindowStyleSimple::paintBackground(gPainter &painter, const ePoint &offset, const eSize &size)
index 10d18e329870779fd2f1b7c1cfb2b59a7a57fe66..99dcf2ecb28f1ba9d540ded7954ede775eb84f2d 100644 (file)
@@ -14,11 +14,10 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
        case iPlayableService::evEnd:
                assert(m_playlist); /* we need to have a playlist */
                
        case iPlayableService::evEnd:
                assert(m_playlist); /* we need to have a playlist */
                
-                       /* at first, kill the running service */
-               m_event(this, evStopService);
-               m_runningService = 0;
-               m_service_event_conn = 0;
-                       /* our running main service stopped. identify what to do next. */
+               /* at first, kill the running service */
+               stopService();
+               
+               /* our running main service stopped. identify what to do next. */
                        
                        /* unless the playlist current position is invalid (because there was */
                        /* playlist, for example when the service was engaged with playService */
                        
                        /* unless the playlist current position is invalid (because there was */
                        /* playlist, for example when the service was engaged with playService */
@@ -41,6 +40,9 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
        case iPlayableService::evStart:
                m_event(this, evNewService);
                break;
        case iPlayableService::evStart:
                m_event(this, evNewService);
                break;
+       case iPlayableService::evUpdatedEventInfo:
+               m_event(this, evUpdatedEventInfo);
+               break;
        default:
                break;
        }
        default:
                break;
        }
@@ -48,6 +50,8 @@ void eNavigation::serviceEvent(iPlayableService* service, int event)
 
 RESULT eNavigation::playService(const eServiceReference &service)
 {
 
 RESULT eNavigation::playService(const eServiceReference &service)
 {
+       stopService();
+       
        assert(m_servicehandler);
        RESULT res = m_servicehandler->play(service, m_runningService);
        if (m_runningService)
        assert(m_servicehandler);
        RESULT res = m_servicehandler->play(service, m_runningService);
        if (m_runningService)
@@ -97,6 +101,20 @@ RESULT eNavigation::getPlaylist(ePtr<ePlaylist> &playlist)
        return 0;
 }
 
        return 0;
 }
 
+RESULT eNavigation::stopService(void)
+{
+               /* check if there is a running service... */
+       if (!m_runningService)
+               return 1;
+                       /* send stop event */
+       m_event(this, evStopService);
+
+               /* kill service. */
+       m_runningService = 0;
+       m_service_event_conn = 0;
+       return 0;
+}
+
 RESULT eNavigation::pause(int dop)
 {
        if (!m_runningService)
 RESULT eNavigation::pause(int dop)
 {
        if (!m_runningService)
index db4384124cca6884a32b8a2ebab9d0fc47224ef1..c049e43d2fc17a41293fe251cb73e5911e0d324a 100644 (file)
@@ -23,7 +23,8 @@ public:
                evStopService,  /** the "current" service was just stopped and likes to be deallocated (clear refs!) */
                evNewService,   /** a new "current" service was just started */
                evPlayFailed,   /** the next service (in playlist) or the one given in playService failed to play */
                evStopService,  /** the "current" service was just stopped and likes to be deallocated (clear refs!) */
                evNewService,   /** a new "current" service was just started */
                evPlayFailed,   /** the next service (in playlist) or the one given in playService failed to play */
-               evPlaylistDone  /** the last service in the playlist was just played */
+               evPlaylistDone, /** the last service in the playlist was just played */
+               evUpdatedEventInfo /** the "currently running" event info was updated */
        };
        
        RESULT playService(const eServiceReference &service);
        };
        
        RESULT playService(const eServiceReference &service);
@@ -32,6 +33,7 @@ public:
 /*     int connectServiceEvent(const Slot1<void,iPlayableService*,int> &event, ePtr<eConnection> &connection); */
        RESULT getCurrentService(ePtr<iPlayableService> &service);
        RESULT getPlaylist(ePtr<ePlaylist> &playlist);
 /*     int connectServiceEvent(const Slot1<void,iPlayableService*,int> &event, ePtr<eConnection> &connection); */
        RESULT getCurrentService(ePtr<iPlayableService> &service);
        RESULT getPlaylist(ePtr<ePlaylist> &playlist);
+       RESULT stopService(void);
        
        RESULT pause(int p);
        eNavigation(iServiceHandler *serviceHandler);
        
        RESULT pause(int p);
        eNavigation(iServiceHandler *serviceHandler);
index 7b61ce5c4d67a0f85305692408141acac4875df1..2d036a1e92971199358fe328bb72e361013bf0ce 100644 (file)
@@ -1,5 +1,7 @@
 #include <lib/nav/pcore.h>
 #include <lib/service/service.h>
 #include <lib/nav/pcore.h>
 #include <lib/service/service.h>
+#include <lib/service/event.h>
+#include <lib/base/eerror.h>
 
 DEFINE_REF(pNavigation);
 
 
 DEFINE_REF(pNavigation);
 
@@ -10,6 +12,8 @@ pNavigation::pNavigation()
 
        assert(service_center);
        m_core = new eNavigation(service_center);
 
        assert(service_center);
        m_core = new eNavigation(service_center);
+       
+       m_core->connectEvent(slot(*this, &pNavigation::navEvent), m_nav_event_connection);
 }
 
 RESULT pNavigation::playService(const eServiceReference &service)
 }
 
 RESULT pNavigation::playService(const eServiceReference &service)
@@ -36,3 +40,26 @@ RESULT pNavigation::pause(int p)
 {
        return m_core->pause(p);
 }
 {
        return m_core->pause(p);
 }
+
+void pNavigation::navEvent(eNavigation *nav, int event)
+{
+               /* just relay the events here. */
+       switch (event)
+       {
+       case eNavigation::evStopService:
+               m_event(evStopService);
+               break;
+       case eNavigation::evNewService:
+               m_event(evNewService);
+               break;
+       case eNavigation::evPlayFailed:
+               m_event(evPlayFailed);
+               break;
+       case eNavigation::evPlaylistDone:
+               m_event(evPlaylistDone);
+               break;
+       case eNavigation::evUpdatedEventInfo:
+               m_event(evUpdatedEventInfo);
+               break;
+       }
+}
index 3bb8f4ef8ec9b43c47857b73bdbac089e807c0e3..004bab27c89c39717a3d4bbe4ff6bf455f4727cd 100644 (file)
@@ -6,13 +6,20 @@
 
 /* a subset of eNavigation */
 
 
 /* a subset of eNavigation */
 
-class pNavigation: public iObject
+class pNavigation: public iObject, public Object
 {
 DECLARE_REF;
 {
 DECLARE_REF;
-private:
-       ePtr<eNavigation> m_core;
 public:
 public:
-       PSignal1<void, int> event;
+       PSignal1<void, int> m_event;
+       
+       enum
+       {
+               evStopService,  /** the "current" service was just stopped and likes to be deallocated (clear refs!) */
+               evNewService,   /** a new "current" service was just started */
+               evPlayFailed,   /** the next service (in playlist) or the one given in playService failed to play */
+               evPlaylistDone, /** the last service in the playlist was just played */
+               evUpdatedEventInfo /** the "currently running" event info was updated */
+       };
        
        pNavigation();
        
        
        pNavigation();
        
@@ -22,6 +29,10 @@ public:
        RESULT getPlaylist(ePtr<ePlaylist> &playlist);
        
        RESULT pause(int p);
        RESULT getPlaylist(ePtr<ePlaylist> &playlist);
        
        RESULT pause(int p);
+private:
+       ePtr<eNavigation> m_core;
+       ePtr<eConnection> m_nav_event_connection;
+       void navEvent(eNavigation *nav, int event);
 };
 
 #endif
 };
 
 #endif
index 3562c3e9a3d8bd020af1af6740a77d8356d9438f..33fc0a1444206cacdeda34d8c3c2e8da2d1b3ab6 100644 (file)
@@ -29,8 +29,7 @@
 
 
 Oh, things like "operator= is private in this context" etc.
 
 
 Oh, things like "operator= is private in this context" etc.
-is usually caused by not marking PSignals as immutable.
-
+is usually caused by not marking PSignals as immutable. 
 */
 
 %define RefCount(...)
 */
 
 %define RefCount(...)
@@ -48,6 +47,7 @@ is usually caused by not marking PSignals as immutable.
 #include <lib/base/econfig.h>
 #include <lib/service/iservice.h>
 #include <lib/service/service.h>
 #include <lib/base/econfig.h>
 #include <lib/service/iservice.h>
 #include <lib/service/service.h>
+#include <lib/service/event.h>
 
 #include <lib/gui/ewidget.h>
 #include <lib/gui/elabel.h>
 
 #include <lib/gui/ewidget.h>
 #include <lib/gui/elabel.h>
@@ -61,6 +61,7 @@ is usually caused by not marking PSignals as immutable.
 #include <lib/service/listboxservice.h>
 #include <lib/components/scan.h>
 #include <lib/nav/pcore.h>
 #include <lib/service/listboxservice.h>
 #include <lib/components/scan.h>
 #include <lib/nav/pcore.h>
+#include <lib/actions/action.h>
 
 extern void runMainloop();
 extern void quitMainloop();
 
 extern void runMainloop();
 extern void quitMainloop();
@@ -73,6 +74,7 @@ RefCount(eListboxServiceContent)
 RefCount(eComponentScan)
 
 #define DEBUG
 RefCount(eComponentScan)
 
 #define DEBUG
+%include "typemaps.i"
 %include "stl.i"
 %include <lib/base/object.h>
 %include <lib/base/eerror.h>
 %include "stl.i"
 %include <lib/base/object.h>
 %include <lib/base/eerror.h>
@@ -81,12 +83,13 @@ RefCount(eComponentScan)
 %include <lib/service/iservice.h>
 %include <lib/service/service.h>
 %template(eServiceCenterPtr) ePtr<eServiceCenter>;
 %include <lib/service/iservice.h>
 %include <lib/service/service.h>
 %template(eServiceCenterPtr) ePtr<eServiceCenter>;
+%include <lib/service/event.h>
 
 
 // TODO: embed these...
 %immutable eButton::selected;
 %immutable eComponentScan::statusChanged;
 
 
 // TODO: embed these...
 %immutable eButton::selected;
 %immutable eComponentScan::statusChanged;
-%immutable pNavigation::event;
+%immutable pNavigation::m_event;
 
 %include <lib/gdi/epoint.h>
 %include <lib/gdi/erect.h>
 
 %include <lib/gdi/epoint.h>
 %include <lib/gdi/erect.h>
@@ -103,6 +106,16 @@ RefCount(eComponentScan)
 %include <lib/service/listboxservice.h>
 %include <lib/components/scan.h>
 %include <lib/nav/pcore.h>
 %include <lib/service/listboxservice.h>
 %include <lib/components/scan.h>
 %include <lib/nav/pcore.h>
+%include <lib/actions/action.h>
+
+/**************  eptr  **************/
+
+%template(eActionMapPtr) ePtr<eActionMap>;
+RefCount(eActionMap)
+%apply eActionMapPtr OUTPUT { eActionMapPtr &ptr }
+%apply eActionMap* *OUTPUT { eActionMap **ptr }
+
+/**************  signals  **************/
 
 template<class R> class PSignal0
 {
 
 template<class R> class PSignal0
 {
index 967f9efaf8991a964a211aaea886eef4705671b7..094b080a89902b7dbc963e6e2671982490842b83 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __service_ievent_h
-#define __service_ievent_h
+#ifndef __lib_service_event_h
+#define __lib_service_event_h
 
 #include <time.h>
 #include <lib/base/object.h>
 
 #include <time.h>
 #include <lib/base/object.h>
@@ -18,4 +18,6 @@ public:
        RESULT parseFrom(Event *evt);
 };
 
        RESULT parseFrom(Event *evt);
 };
 
+TEMPLATE_TYPEDEF(ePtr<eServiceEvent>, eServiceEventPtr);
+
 #endif
 #endif
index f699bdb91853eff51fda94c7452726198e67090d..c58421eddb77b923030a3dfe6c42bb832ae1809b 100644 (file)
@@ -6,14 +6,6 @@
 #include <connection.h>
 #include <list>
 
 #include <connection.h>
 #include <list>
 
-#ifdef SWIG
-#define TEMPLATE_TYPEDEF(x, y) \
-%template(y) x; \
-typedef x y
-#else
-#define TEMPLATE_TYPEDEF(x, y) typedef x y
-#endif
-
 class eServiceReference
 {
 public:
 class eServiceReference
 {
 public:
@@ -184,7 +176,7 @@ public:
                evEnd,
                
                // when iServiceInformation is implemented:
                evEnd,
                
                // when iServiceInformation is implemented:
-               evNewEvent
+               evUpdatedEventInfo
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
index 06b6d97f743a4fcfc3fa19e173a9683658b87bed..48d00d651ab672d890391e0886377ee84f7665bc 100644 (file)
@@ -146,6 +146,7 @@ eDVBServicePlay::~eDVBServicePlay()
 
 void eDVBServicePlay::gotNewEvent()
 {
 
 void eDVBServicePlay::gotNewEvent()
 {
+#if 0
                // debug only
        ePtr<eServiceEvent> m_event_now, m_event_next;
        getEvent(m_event_now, 0);
                // debug only
        ePtr<eServiceEvent> m_event_now, m_event_next;
        getEvent(m_event_now, 0);
@@ -155,6 +156,8 @@ void eDVBServicePlay::gotNewEvent()
                eDebug("now running: %s (%d seconds :)", m_event_now->m_event_name.c_str(), m_event_now->m_duration);
        if (m_event_next)
                eDebug("next running: %s (%d seconds :)", m_event_next->m_event_name.c_str(), m_event_next->m_duration);
                eDebug("now running: %s (%d seconds :)", m_event_now->m_event_name.c_str(), m_event_now->m_duration);
        if (m_event_next)
                eDebug("next running: %s (%d seconds :)", m_event_next->m_event_name.c_str(), m_event_next->m_duration);
+#endif
+       m_event((iPlayableService*)this, evUpdatedEventInfo);
 }
 
 void eDVBServicePlay::serviceEvent(int event)
 }
 
 void eDVBServicePlay::serviceEvent(int event)
@@ -254,7 +257,8 @@ RESULT eDVBServicePlay::stop()
 
 RESULT eDVBServicePlay::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
 {
 
 RESULT eDVBServicePlay::connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)
 {
-       return -1;
+       connection = new eConnection((iPlayableService*)this, m_event.connect(event));
+       return 0;
 }
 
 RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr)
 }
 
 RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr)
index 941ad7bd32858838836bae95c970c324191906e0..2e8d899a8fc5a63da7e86c11ebb0f1ed2739064a 100644 (file)
@@ -51,6 +51,7 @@ private:
        void gotNewEvent();
        
        void serviceEvent(int event);
        void gotNewEvent();
        
        void serviceEvent(int event);
+       Signal2<void,iPlayableService*,int> m_event;
 public:
        virtual ~eDVBServicePlay();
 
 public:
        virtual ~eDVBServicePlay();
 
index a8ecca4f11efe9cea284ee919a9f70cb87cb2c8f..1fdf8c3251d86f291589904e96c751b81c36f5c0 100644 (file)
@@ -8,6 +8,7 @@ enigma2_SOURCES = \
        enigma.cpp 
 
 enigma2_LDADD_WHOLE = \
        enigma.cpp 
 
 enigma2_LDADD_WHOLE = \
+       $(top_builddir)/lib/actions/libenigma_actions.a \
        $(top_builddir)/lib/base/libenigma_base.a \
        $(top_builddir)/lib/components/libenigma_components.a \
        $(top_builddir)/lib/driver/libenigma_driver.a \
        $(top_builddir)/lib/base/libenigma_base.a \
        $(top_builddir)/lib/components/libenigma_components.a \
        $(top_builddir)/lib/driver/libenigma_driver.a \
index b055619e240b3d505c9abc407680db9c163e8aa4..6bf0bb9759e711a7a910859862de8f8542bcd308 100644 (file)
@@ -25,6 +25,8 @@
 
 #include <lib/driver/rc.h>
 
 
 #include <lib/driver/rc.h>
 
+#include <lib/actions/action.h>
+
 #ifdef OBJECT_DEBUG
 int object_total_remaining;
 
 #ifdef OBJECT_DEBUG
 int object_total_remaining;
 
@@ -71,8 +73,11 @@ PSignal1<void,int> &keyPressedSignal()
 
 void keyEvent(const eRCKey &key)
 {
 
 void keyEvent(const eRCKey &key)
 {
-       if (!key.flags)
-               keyPressed(key.code);
+       ePtr<eActionMap> ptr;
+       eActionMap::getInstance(ptr);
+       ptr->keyPressed(0, key.code, key.flags);
+//     if (!key.flags)
+//             keyPressed(key.code);
 }
 
 /************************************************/
 }
 
 /************************************************/
@@ -163,8 +168,10 @@ int main(int argc, char **argv)
        eRCInput::getInstance()->keyEvent.connect(slot(keyEvent));
        
        printf("executing main\n");
        eRCInput::getInstance()->keyEvent.connect(slot(keyEvent));
        
        printf("executing main\n");
+
        python.execute("mytest", "__main__");
 
        python.execute("mytest", "__main__");
 
+
 //     eApp->exec();
 
        return 0;
 //     eApp->exec();
 
        return 0;
index 388fcdac56a6006be4762222d10f335af41cc18d..80158884561fcf3b42705aaa4c81ffaf9835ecb8 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -1,6 +1,7 @@
 from enigma import *
 from tools import *
 
 from enigma import *
 from tools import *
 
+
 import sys
 import time
 
 import sys
 import time
 
@@ -57,38 +58,44 @@ class Session:
                self.dialogStack = [ ]
        
        def processDelay(self):
                self.dialogStack = [ ]
        
        def processDelay(self):
+               self.execEnd()
                self.currentDialog.doClose()
                self.currentDialog.doClose()
-               if self.currentWindow != None:
-                       self.currentWindow.hide()
                
                del self.currentDialog
                del self.currentWindow
                
                if len(self.dialogStack):
                        (self.currentDialog, self.currentWindow) = self.dialogStack.pop()
                
                del self.currentDialog
                del self.currentWindow
                
                if len(self.dialogStack):
                        (self.currentDialog, self.currentWindow) = self.dialogStack.pop()
+                       self.execBegin()
+                       
+       def execBegin(self):
+                       self.currentDialog.execBegin()
                        self.currentWindow.show()
                        self.currentWindow.show()
+               
+       def execEnd(self):
+                       self.currentDialog.execEnd()
+                       self.currentWindow.hide()
+       
+       def create(self, screen, arguments):
+               return screen(self, *arguments)
        
        
-       def open(self, screen):
+       def open(self, screen, *arguments):
                if self.currentDialog:
                        self.dialogStack.append((self.currentDialog, self.currentWindow))
                if self.currentDialog:
                        self.dialogStack.append((self.currentDialog, self.currentWindow))
-                       self.currentWindow.hide()
+                       self.execEnd()
                
                
-               self.currentDialog = screen
-               screen.session = self
+               self.currentDialog = self.create(screen, arguments)
                
                if self.desktop != None:
                
                if self.desktop != None:
-                       self.currentWindow = wnd = eWindow(self.desktop)
-#                      wnd.setTitle("Screen from python!")
-#                      wnd.move(ePoint(300, 100))
-#                      wnd.resize(eSize(300, 300))
+                       self.currentWindow = eWindow(self.desktop)
 
                        gui = GUIOutputDevice()
 
                        gui = GUIOutputDevice()
-                       gui.parent = wnd
+                       gui.parent = self.currentWindow
                        gui.create(self.currentDialog)
 
                        gui.create(self.currentDialog)
 
-                       applyGUIskin(self.currentDialog, wnd, None, screen.__class__.__name__)
+                       applyGUIskin(self.currentDialog, self.currentWindow, None, self.currentDialog.skinName)
 
 
-                       wnd.show()
+                       self.execBegin()
                else:
                        self.currentWindow = None
 
                else:
                        self.currentWindow = None
 
@@ -115,7 +122,7 @@ def runScreenTest():
        
        session.nav = pNavigation()
        
        
        session.nav = pNavigation()
        
-       session.open(infoBar())
+       session.open(infoBar)
 
        CONNECT(keyPressedSignal(), session.keyEvent)
        
 
        CONNECT(keyPressedSignal(), session.keyEvent)
        
@@ -123,6 +130,8 @@ def runScreenTest():
        
        return 0
 
        
        return 0
 
+import keymapparser
+keymapparser.readKeymap()
 
 # first, setup a screen
 runScreenTest()
 
 # first, setup a screen
 runScreenTest()
index 39b4265e560303cb3031829deef877b71654e2df..cf0daae98329b46dc4328fce67ff2af3577cb673 100644 (file)
@@ -8,6 +8,19 @@ def doGlobal(screen):
 
 class Screen(dict, HTMLSkin, GUISkin):
        """ bla """
 
 class Screen(dict, HTMLSkin, GUISkin):
        """ bla """
+
+       def __init__(self, session):
+               self.skinName = self.__class__.__name__
+               self.session = session
+               GUISkin.__init__(self)
+               
+       def execBegin(self):
+               for (name, val) in self.items():
+                       val.execBegin()
+       
+       def execEnd(self):
+               for (name, val) in self.items():
+                       val.execEnd()
        
        # never call this directly - it will be called from the session!
        def doClose(self):
        
        # never call this directly - it will be called from the session!
        def doClose(self):
@@ -15,7 +28,7 @@ class Screen(dict, HTMLSkin, GUISkin):
        
        def close(self, retval=None):
                self.session.close()
        
        def close(self, retval=None):
                self.session.close()
-       
+
 class mainMenu(Screen):
        
        def goEmu(self):
 class mainMenu(Screen):
        
        def goEmu(self):
@@ -28,19 +41,24 @@ class mainMenu(Screen):
                self["title"].setText("HDTV GREEN FLASHES: ENABLED")
        
        def goScan(self):
                self["title"].setText("HDTV GREEN FLASHES: ENABLED")
        
        def goScan(self):
-               self.session.open(serviceScan())
+               self.session.open(serviceScan)
        
        def goClock(self):
        
        def goClock(self):
-               self.session.open(clockDisplay(Clock()))
+               self.session.open(clockDisplay, Clock())
 
        def okbuttonClick(self):
                selection = self["menu"].getCurrent()
                selection[1]()
 
        def okbuttonClick(self):
                selection = self["menu"].getCurrent()
                selection[1]()
-
-       def __init__(self):
-               GUISkin.__init__(self)
+       
+       def __init__(self, session):
+               Screen.__init__(self, session)
                b = Button("ok")
 
                b = Button("ok")
 
+               self["actions"] = ActionMap("MainMenuActions", 
+                       {
+                               "selected": self.okbuttonClick
+                       })
+
                b.onClick = [ self.okbuttonClick ]
                self["okbutton"] = b
                self["title"] = Header("Main Menu! - press ok to leave!")
                b.onClick = [ self.okbuttonClick ]
                self["okbutton"] = b
                self["title"] = Header("Main Menu! - press ok to leave!")
@@ -64,38 +82,54 @@ class mainMenu(Screen):
 #              self["okbutton"].onClick = [ self.close ]
 
 class channelSelection(Screen):
 #              self["okbutton"].onClick = [ self.close ]
 
 class channelSelection(Screen):
-       def __init__(self):
-               GUISkin.__init__(self)
+       def __init__(self, session):
+               Screen.__init__(self, session)
                
                self["list"] = ServiceList()
                self["list"].setRoot(eServiceReference("1:0:1:0:0:0:0:0:0:0:PREMIERE"))
                
                
                self["list"] = ServiceList()
                self["list"].setRoot(eServiceReference("1:0:1:0:0:0:0:0:0:0:PREMIERE"))
                
-               self["okbutton"] = Button("ok", [self.channelSelected, self.close])
+               self["okbutton"] = Button("ok", [self.channelSelected])
+
+               self["actions"] = ActionMap("ChannelSelectActions", 
+                       {
+                               "selectChannel": self.channelSelected,
+                       })
 
        def channelSelected(self):
                self.session.nav.playService(self["list"].getCurrent())
 
        def channelSelected(self):
                self.session.nav.playService(self["list"].getCurrent())
+               self.close()
                pass
 
 class infoBar(Screen):
                pass
 
 class infoBar(Screen):
-       def __init__(self):
-               GUISkin.__init__(self)
+       def __init__(self, session):
+               Screen.__init__(self, session)
                
                
+               self["actions"] = ActionMap("InfobarActions", 
+                       {
+                               "switchChannel": self.switchChannel,
+                               "mainMenu": self.mainMenu
+                       })
                self["channelSwitcher"] = Button("switch Channel", [self.switchChannel])
                self["okbutton"] = Button("mainMenu", [self.mainMenu])
                self["channelSwitcher"] = Button("switch Channel", [self.switchChannel])
                self["okbutton"] = Button("mainMenu", [self.mainMenu])
+               
+               self["ServiceName"] = ServiceName(self.session.nav)
+               
+               self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
+               self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
        
        def mainMenu(self):
        
        def mainMenu(self):
-               self.session.open(mainMenu())
+               self.session.open(mainMenu)
                
        def switchChannel(self):
                
        def switchChannel(self):
-               self.session.open(channelSelection())
+               self.session.open(channelSelection)
 
 # a clock display dialog
 class clockDisplay(Screen):
        def okbutton(self):
                self.session.close()
        
 
 # a clock display dialog
 class clockDisplay(Screen):
        def okbutton(self):
                self.session.close()
        
-       def __init__(self, clock):
-               GUISkin.__init__(self)
+       def __init__(self, session, clock):
+               Screen.__init__(self, session)
                self["theClock"] = clock
                b = Button("bye")
                b.onClick = [ self.okbutton ]
                self["theClock"] = clock
                b = Button("bye")
                b.onClick = [ self.okbutton ]
@@ -108,8 +142,8 @@ class serviceScan(Screen):
                if self["scan"].isDone():
                        self.close()
        
                if self["scan"].isDone():
                        self.close()
        
-       def __init__(self):
-               GUISkin.__init__(self)
+       def __init__(self, session):
+               Screen.__init__(self, session)
                
                self["scan_progress"] = ProgressBar()
                self["scan_state"] = Label("scan state")
                
                self["scan_progress"] = ProgressBar()
                self["scan_state"] = Label("scan state")
diff --git a/skin.py b/skin.py
index 5684c583e9d27e76df78a22d6f21d541f2e473bf..46a14292fd72c7c7bb814f554193fe52076ef317 100644 (file)
--- a/skin.py
+++ b/skin.py
@@ -25,6 +25,9 @@ dom = xml.dom.minidom.parseString(
                </screen>
                <screen name="infoBar" position="100,100" size="300,400" title="InfoBar">
                        <widget name="channelSwitcher" position="10,190" size="280,50" />
                </screen>
                <screen name="infoBar" position="100,100" size="300,400" title="InfoBar">
                        <widget name="channelSwitcher" position="10,190" size="280,50" />
+                       <widget name="ServiceName" position="50,20" size="200,30" />
+                       <widget name="Event_Now" position="50,50" size="200,30" />
+                       <widget name="Event_Next" position="50,80" size="200,30" />
                </screen>
                <screen name="channelSelection" position="300,100" size="300,300" title="Channel Selection">
                        <widget name="okbutton" position="10,190" size="280,50" />
                </screen>
                <screen name="channelSelection" position="300,100" size="300,300" title="Channel Selection">
                        <widget name="okbutton" position="10,190" size="280,50" />