Sophie

Sophie

distrib > Mandriva > 2010.1 > x86_64 > by-pkgid > adc71b89727e16d9b88f5dd238a4d4c5 > files > 26

vdr-1.6.0-17mdv2010.1.src.rpm

#! /bin/sh /usr/share/dpatch/dpatch-run
## opt-37-x_menuorg.dpatch by Tobias Grimm <tg@e-tobi.net>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: This patch is required by the MenuOrg plugin. It adds a service
## DP: interface, that can be implemented by plugins to reorganize 
## DP: VDR's main menu entries with the ability to create custom sub
## DP: menus.
## DP: This is version 0.4.s of the patch

@DPATCH@
diff -p -up vdr-1.6.0/mainmenuitemsprovider.h.orig vdr-1.6.0/mainmenuitemsprovider.h
--- vdr-1.6.0/mainmenuitemsprovider.h.orig	2009-07-25 21:22:31.243091909 +0300
+++ vdr-1.6.0/mainmenuitemsprovider.h	2009-07-25 21:22:31.243091909 +0300
@@ -0,0 +1,60 @@
+/*
+ * vdr-menuorg - A plugin for the Linux Video Disk Recorder
+ * Copyright (c) 2007 - 2008 Tobias Grimm <vdr@e-tobi.net>
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * $Id$
+ *
+ */
+
+#ifndef __MAINMENUITEMSPROVIDER_H
+#define __MAINMENUITEMSPROVIDER_H
+
+#include <vector>
+
+class cOsdItem;
+class cOsdMenu;
+
+class IMenuItemDefinition
+{
+    public:
+        virtual ~IMenuItemDefinition() {};
+        virtual bool IsCustomOsdItem() = 0;
+        virtual bool IsPluginItem() = 0;
+        virtual bool IsSeparatorItem() = 0;
+        virtual cOsdItem* CustomOsdItem() = 0;
+        virtual const char* PluginMenuEntry() = 0;
+        virtual bool IsSelected() = 0;
+        virtual int PluginIndex() = 0;
+};
+
+typedef std::vector<IMenuItemDefinition*> MenuItemDefinitions;
+
+#define MENU_ITEMS_PROVIDER_SERVICE_ID "MenuOrgPatch-v0.4.2::MainMenuItemsProvider"
+
+class IMainMenuItemsProvider
+{
+    public:
+        virtual ~IMainMenuItemsProvider() {};
+        virtual bool IsCustomMenuAvailable() = 0;
+        virtual MenuItemDefinitions* MainMenuItems() = 0;
+        virtual void EnterRootMenu() = 0;
+        virtual void EnterSubMenu(cOsdItem* item) = 0;
+        virtual bool LeaveSubMenu() = 0;
+        virtual cOsdMenu* Execute(cOsdItem* item) = 0;
+};
+
+#endif //__MAINMENUITEMSPROVIDER_H
diff -p -up vdr-1.6.0/menu.c.orig vdr-1.6.0/menu.c
--- vdr-1.6.0/menu.c.orig	2009-07-25 21:22:30.745092093 +0300
+++ vdr-1.6.0/menu.c	2009-07-25 21:22:31.282094446 +0300
@@ -31,6 +31,7 @@
 #include "transfer.h"
 #include "vdrttxtsubshooks.h"
 #include "videodir.h"
+#include "menuorgpatch.h"
 
 #define MAXWAIT4EPGINFO   3 // seconds
 #define MODETIMEOUT       3 // seconds
@@ -3226,6 +3227,9 @@ cMenuMain::cMenuMain(eOSState State)
   cancelEditingItem = NULL;
   stopRecordingItem = NULL;
   recordControlsState = 0;
+
+  MenuOrgPatch::EnterRootMenu();
+
   Set();
 
   // Initial submenus:
@@ -3254,6 +3258,29 @@ void cMenuMain::Set(void)
   SetTitle("VDR");
   SetHasHotkeys();
 
+  if (MenuOrgPatch::IsCustomMenuAvailable()) {
+     MenuItemDefinitions* menuItems = MenuOrgPatch::MainMenuItems();
+     for (MenuItemDefinitions::iterator i = menuItems->begin(); i != menuItems->end(); i++) {
+         cOsdItem* osdItem = NULL;
+         if ((*i)->IsCustomOsdItem()) {
+            osdItem = (*i)->CustomOsdItem();
+            if (osdItem &&  !(*i)->IsSeparatorItem())
+                   osdItem->SetText(hk(osdItem->Text()));
+            }
+         else if ((*i)->IsPluginItem()) {
+            const char *item = (*i)->PluginMenuEntry();
+            if (item)
+              osdItem = new cMenuPluginItem(hk(item), (*i)->PluginIndex());
+            }
+         if (osdItem) {
+            Add(osdItem);
+            if ((*i)->IsSelected())
+               SetCurrent(osdItem);
+            }
+         }
+     }
+  else {
+
   // Basic menu items:
 
   Add(new cOsdItem(hk(tr("Schedule")),   osSchedule));
@@ -3280,6 +3307,8 @@ void cMenuMain::Set(void)
   if (Commands.Count())
      Add(new cOsdItem(hk(tr("Commands")),  osCommands));
 
+  }
+
   Update(true);
 
   Display();
@@ -3395,6 +3424,41 @@ eOSState cMenuMain::ProcessKey(eKeys Key
                          state = osEnd;
                        }
                        break;
+    case osBack:       {
+                          if (MenuOrgPatch::IsCustomMenuAvailable())
+                          {
+                            bool leavingMenuSucceeded = MenuOrgPatch::LeaveSubMenu();
+                            Set();
+                            stopReplayItem = NULL;
+                            cancelEditingItem = NULL;
+                            stopRecordingItem = NULL;
+                            recordControlsState = 0;
+                            Update(true);
+                            Display();
+                            if (leavingMenuSucceeded)
+                              return osContinue;
+                            else
+                              return osEnd;
+                          }
+                       }
+                       break;
+    case osUser1:      {
+                          if (MenuOrgPatch::IsCustomMenuAvailable()) {
+                            MenuOrgPatch::EnterSubMenu(Get(Current()));
+                            Set();
+                            return osContinue;
+                          }
+                       }
+                       break;
+    case osUser2:      {
+                          if (MenuOrgPatch::IsCustomMenuAvailable()) {
+                            cOsdMenu* osdMenu = MenuOrgPatch::Execute(Get(Current()));
+                            if (osdMenu)
+                              return AddSubMenu(osdMenu);
+                            return osEnd;
+                          }
+                       }
+                       break;
     default: switch (Key) {
                case kRecord:
                case kRed:    if (!HadSubMenu)
diff -p -up vdr-1.6.0/menuorgpatch.h.orig vdr-1.6.0/menuorgpatch.h
--- vdr-1.6.0/menuorgpatch.h.orig	2009-07-25 21:22:31.293094206 +0300
+++ vdr-1.6.0/menuorgpatch.h	2009-07-25 21:22:31.293094206 +0300
@@ -0,0 +1,100 @@
+/*
+ * vdr-menuorg - A plugin for the Linux Video Disk Recorder
+ * Copyright (c) 2007 - 2008 Tobias Grimm <vdr@e-tobi.net>
+ *
+ * This program 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * $Id$
+ *
+ */
+
+#ifndef __MENUORGPATCH_H
+#define __MENUORGPATCH_H
+
+#include "mainmenuitemsprovider.h"
+
+class MenuOrgPatch
+{
+    private:
+        static IMainMenuItemsProvider* _mainMenuItemsProvider;
+
+    private:
+        static IMainMenuItemsProvider* MainMenuItemsProvider()
+        {
+            if (!_mainMenuItemsProvider)
+            {
+                IMainMenuItemsProvider* mainMenuItemsProvider;
+
+                if (cPluginManager::CallFirstService(MENU_ITEMS_PROVIDER_SERVICE_ID, &mainMenuItemsProvider))
+                {
+                    _mainMenuItemsProvider = mainMenuItemsProvider;
+                }
+            }
+            return _mainMenuItemsProvider;
+        }
+
+    public:
+        static bool IsCustomMenuAvailable()
+        {
+            return (MainMenuItemsProvider() != NULL) && (MainMenuItemsProvider()->IsCustomMenuAvailable());
+        }
+
+        static void EnterRootMenu()
+        {
+            if (MainMenuItemsProvider())
+            {
+                MainMenuItemsProvider()->EnterRootMenu();
+            }
+        }
+
+        static bool LeaveSubMenu()
+        {
+            if (MainMenuItemsProvider())
+            {
+                return MainMenuItemsProvider()->LeaveSubMenu();
+            }
+            return false;
+        }
+
+        static void EnterSubMenu(cOsdItem* item)
+        {
+            if (MainMenuItemsProvider())
+            {
+                MainMenuItemsProvider()->EnterSubMenu(item);
+            }
+        }
+
+        static MenuItemDefinitions* MainMenuItems()
+        {
+            if (MainMenuItemsProvider())
+            {
+                return MainMenuItemsProvider()->MainMenuItems();
+            }
+            return NULL;
+        }
+
+        static cOsdMenu* Execute(cOsdItem* item)
+        {
+            if (MainMenuItemsProvider())
+            {
+                return MainMenuItemsProvider()->Execute(item);
+            }
+            return NULL;
+        }
+};
+
+IMainMenuItemsProvider* MenuOrgPatch::_mainMenuItemsProvider = NULL;
+
+#endif //__MENUORGPATCH_H