#! /bin/sh /usr/share/dpatch/dpatch-run ## opt-37_submenu.dpatch by Jlac, Sad (submenu plugin) ## extracted from submenu plugin 0.0.2 ## original filename: vdr-submenu-patch-1.3.1x-from-orig.diff ## ## Tobias Grimm : ## - free char buffers allocated by asprintf ## Thomas Günther : ## - made independend from enAIO patch ## - fixed current menu item ## - set count of submenu entries to 255 ## - adapted to VDR-1.3.38 ## - fixed problems with MenuCmdPosition=top (from liemikuutio (enAIO) patch) ## http://toms-cafe.de/vdr/download/vdr-submenu-0.7-1.3.38+.diff ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: This patch is needed for the submenu plugin. @DPATCH@ diff -Naur vdr-1.3.42/Makefile vdr-1.3.42-submenu-0.7/Makefile --- vdr-1.3.42/Makefile 2006-02-05 14:37:11.000000000 +0100 +++ vdr-1.3.42-submenu-0.7/Makefile 2006-02-07 14:53:28.000000000 +0100 @@ -49,7 +49,7 @@ lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\ receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o\ skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\ - timers.o tools.o transfer.o vdr.o videodir.o + timers.o tools.o transfer.o vdr.o videodir.o submenu.o FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1 OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1 diff -Naur vdr-1.3.42/menu.c vdr-1.3.42-submenu-0.7/menu.c --- vdr-1.3.42/menu.c 2006-02-05 14:31:08.000000000 +0100 +++ vdr-1.3.42-submenu-0.7/menu.c 2006-02-07 14:53:28.000000000 +0100 @@ -2773,11 +2773,110 @@ SetTitle("VDR"); SetHasHotkeys(); - // Basic menu items: - - Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); - Add(new cOsdItem(hk(tr("Channels")), osChannels)); - Add(new cOsdItem(hk(tr("Timers")), osTimers)); +//SubMenu Patch + bool SubMenuActive=cPluginManager::GetPlugin("submenu"); + if (SubMenuActive) + submenu.offset = Count(); + +if (SubMenuActive) // if ( SubmenuActive && !Plugin) +{ +cPlugin *p; +/* +0::Schedule +0::Channels +0:1:Games +1::games +1::freecell +1::solitaire +*/ + +// Parse info of current Menu +// add item of menu + for( int i = 0; i < submenu.nbSubMenuItem; i++) + { + if( submenu.subMenuItem[i].menuLevel == submenu.currentMenuLevel ) + { + if( submenu.subMenuItem[i].kindOfItem == 0 ) + { + // Basic menu items: + if( strcmp(submenu.subMenuItem[i].name,"Schedule") == 0 ) + Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); + + if( strcmp(submenu.subMenuItem[i].name,"Channels") == 0 ) + Add(new cOsdItem(hk(tr("Channels")), osChannels)); + + if( strcmp(submenu.subMenuItem[i].name,"Timers") == 0 ) + Add(new cOsdItem(hk(tr("Timers")), osTimers)); + + if( strcmp(submenu.subMenuItem[i].name,"Recordings") == 0 ) + Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); + if( strcmp(submenu.subMenuItem[i].name,"Setup") == 0 ) + Add(new cOsdItem(hk(tr("Setup")), osSetup)); + + if( strcmp(submenu.subMenuItem[i].name,"Commands") == 0 ) + { + if (Commands.Count()) + Add(new cOsdItem(hk(tr("Commands")), osCommands)); + } + // Plugins Item: + int j=0; + do + { + p = cPluginManager::GetPlugin(j); + if( p != NULL ) + { + const char *item = p->MainMenuEntry(); + if (item) + { + if( strcmp( submenu.subMenuItem[i].name , p->Name() ) == 0 ) + Add(new cMenuPluginItem(hk(item), j)); + } + } + j++; + } + while( p != NULL); + } + else + { + Add(new cOsdItem(hk(submenu.subMenuItem[i].name), osUser9)); + } + } +} + /* Add all plugin entry not listed in config file */ +if ( submenu.currentMenuLevel == 0 ) +{ + int j=0; + do + { + p = cPluginManager::GetPlugin(j); + if( p != NULL ) + { + const char *item = p->MainMenuEntry(); + if (item) + { + int trv = 0; + for( int i = 0; i < submenu.nbSubMenuItem; i++) + { + if( strcmp( submenu.subMenuItem[i].name , p->Name() ) == 0 ) + trv = 1; + } + if(trv == 0) + Add(new cMenuPluginItem(hk(item), j)); + } + } + j++; + } + while( p != NULL); + } + +} +else +{ +// Basic menu items: + +Add(new cOsdItem(hk(tr("Schedule")), osSchedule)); +Add(new cOsdItem(hk(tr("Channels")), osChannels)); +Add(new cOsdItem(hk(tr("Timers")), osTimers)); Add(new cOsdItem(hk(tr("Recordings")), osRecordings)); // Plugins: @@ -2798,6 +2897,7 @@ Add(new cOsdItem(hk(tr("Setup")), osSetup)); if (Commands.Count()) Add(new cOsdItem(hk(tr("Commands")), osCommands)); +} Update(true); @@ -2809,6 +2909,10 @@ bool cMenuMain::Update(bool Force) { bool result = false; + bool SubMenuActive=cPluginManager::GetPlugin("submenu"); + cOsdItem* first = NULL; + if (SubMenuActive) + first = Get(submenu.offset); // Title with disk usage: if (Force || time(NULL) - lastDiskSpaceCheck > DISKSPACECHEK) { @@ -2874,6 +2978,9 @@ result = true; } + if (SubMenuActive && first) + submenu.offset = first->Index(); + return result; } @@ -2904,6 +3011,24 @@ return osEnd; } break; + case osBack: + if (submenu.nbLevelMenu > 0) + { + submenu.nbLevelMenu--; + submenu.currentMenuLevel = submenu.oldNumberMenu[ submenu.nbLevelMenu ]; + Set(); + return osContinue; + } + else + return osEnd; + break; + case osUser9: + submenu.oldNumberMenu[ submenu.nbLevelMenu] = submenu.currentMenuLevel; + submenu.nbLevelMenu++; + submenu.currentMenuLevel = submenu.GetByLevel(submenu.currentMenuLevel,Current()-submenu.offset); + Set(); + return osContinue; + break; case osPlugin: { cMenuPluginItem *item = (cMenuPluginItem *)Get(Current()); if (item) { diff -Naur vdr-1.3.42/menu.h vdr-1.3.42-submenu-0.7/menu.h --- vdr-1.3.42/menu.h 2006-01-22 15:24:31.000000000 +0100 +++ vdr-1.3.42-submenu-0.7/menu.h 2006-02-07 14:53:28.000000000 +0100 @@ -18,6 +18,7 @@ #include "menuitems.h" #include "recorder.h" #include "skins.h" +#include "submenu.h" class cMenuText : public cOsdMenu { private: @@ -55,6 +56,7 @@ class cMenuMain : public cOsdMenu { private: + cSubMenu submenu; time_t lastDiskSpaceCheck; int lastFreeMB; bool replaying; diff -Naur vdr-1.3.42/submenu.c vdr-1.3.42-submenu-0.7/submenu.c --- vdr-1.3.42/submenu.c 1970-01-01 01:00:00.000000000 +0100 +++ vdr-1.3.42-submenu-0.7/submenu.c 2006-02-07 14:53:28.000000000 +0100 @@ -0,0 +1,397 @@ +#include "submenu.h" +#include +#include +#include "plugin.h" + +cSubMenuItemInfo::cSubMenuItemInfo() + { + menuLevel = 0; + kindOfItem = 0; + name[0] = 0; + } + +cSubMenuItemInfo::~cSubMenuItemInfo() +{ +} + +void cSubMenuItemInfo::setname(const char *n) +{ + int i,l; + l = strlen(n); + + for(i=0;i= SIZEMAXNAMESUBMENUITEMINFO ) + l = SIZEMAXNAMESUBMENUITEMINFO; + + for(i=0;iName()); + } + j++; + } + while (p !=NULL); + + fclose(fo); + LoadInfoSubMenu(); + Arbo.Populate(this); + } + /* -- Create example file -- */ + } + free(fichier); +} + +void cSubMenu::ParseOneLigOfFile(const char *lig) +{ + int level=-1; + int kind=-1; + int i,j,l; + char txt[SIZEMAXNAMESUBMENUITEMINFO]; + char name[SIZEMAXNAMESUBMENUITEMINFO]; + int fin,status = 0; + int namefound = 0; + + l = strlen(lig); + + name[0]= 0; + + fin = 0; + + i=0;j=0; + + while( fin == 0) + { + switch(status) + { + case 0: //looking for level + txt[j++] = lig[i]; + if ( lig[i] == ':' ) + { + txt[j] = 0; + status ++; + level = atoi(txt); + j = 0; + } + + break; + case 1: + txt[j++] = lig[i]; + if (lig[i] == ':') + { + txt[j] = 0; + status ++; + kind = atoi(txt); + j = 0; + } + break; + case 2: + if (lig[i]>32 || lig[i]<0) + name[j++] = lig[i]; + if(lig[i]== 0) + { + name[j]=0; + namefound=1; + status++; + } + + break; + default: + break; + + } + if (lig[i] == '/') + fin = 1; + if (lig[i] == 0) + fin = 1; + if ( i == l ) + fin = 1; + + i++; + } + + if (level!=-1 && kind!=-1 && namefound==1) + { + name[j]=0; + subMenuItem[nbSubMenuItem].menuLevel = level; + subMenuItem[nbSubMenuItem].kindOfItem = kind; + subMenuItem[nbSubMenuItem].setname(name); + nbSubMenuItem++; + } +} + +void cSubMenu::SaveInfoSubMenu() +{ + //Dump(); + FILE *f; + char *fichier; + asprintf(&fichier,"%s/MainMenu.conf",cPlugin::ConfigDirectory()); + f=fopen(fichier,"w"); + if (f) + { + for (int i=0;iposition;i--) + { + subMenuItem[i]=subMenuItem[i-1]; + } + nbSubMenuItem++; + Arbo.Populate(this); +} + + +cArbo::cArbo(void) +{ + MaxLevel=0; + for (int i=0;inbSubMenuItem;i++) + { + Index[ submenu->subMenuItem[i].menuLevel ][ submenu->Arbo.MaxItem[submenu->subMenuItem[i].menuLevel]] = i; + submenu->Arbo.MaxItem[submenu->subMenuItem[i].menuLevel]++; + if (submenu->subMenuItem[i].menuLevel > submenu->Arbo.MaxLevel) + { + submenu->Arbo.MaxLevel = submenu->subMenuItem[i].menuLevel; + } + if (submenu->subMenuItem[i].kindOfItem > submenu->Arbo.MaxLevel) + { + submenu->Arbo.MaxLevel = submenu->subMenuItem[i].kindOfItem; + } + } +} diff -Naur vdr-1.3.42/submenu.h vdr-1.3.42-submenu-0.7/submenu.h --- vdr-1.3.42/submenu.h 1970-01-01 01:00:00.000000000 +0100 +++ vdr-1.3.42-submenu-0.7/submenu.h 2006-02-07 14:53:28.000000000 +0100 @@ -0,0 +1,62 @@ +#ifndef __SUBMENU_H +#define __SUBMENU_H + +#define SIZEMAXNAMESUBMENUITEMINFO 30 +#define NBMAXSUBMENUANDITEM 255 + +class cSubMenu; + +class cSubMenuItemInfo +{ + private: + public: + cSubMenuItemInfo(); + ~cSubMenuItemInfo(); + + int menuLevel; + int kindOfItem; + char name[SIZEMAXNAMESUBMENUITEMINFO]; //todo revoir ca(la taille en dur) + + void setname(const char *n); +}; + +class cArbo +{ + private: + public: + cArbo(void); + ~cArbo(void); + int Index[NBMAXSUBMENUANDITEM][NBMAXSUBMENUANDITEM]; + int CurrentIndex[NBMAXSUBMENUANDITEM]; + int MaxLevel; + int MaxItem[NBMAXSUBMENUANDITEM]; + void Populate(cSubMenu *submenu); + void Clear(void); +}; + +class cSubMenu +{ + private: + public: + int currentMenuLevel; + cSubMenuItemInfo *subMenuItem; + cArbo Arbo; + int nbSubMenuItem; + int oldNumberMenu[ NBMAXSUBMENUANDITEM ]; + int nbLevelMenu; + + int offset; // For MenuCmdPosition issue + + cSubMenu(); + virtual ~cSubMenu(); + void LoadInfoSubMenu(void); + void ParseOneLigOfFile (const char *lig); + void SaveInfoSubMenu(void); + int GetByLevel(int Level, int curr); + int GetByLevel(int Level); + void CreateItem(int type,int position,int where,char *Name=""); + void DeleteItem(int position,int kindItem=-1); + void InsertItem(int position); + void Dump(void); +}; +#endif //__SUBMENU_H