From 64ddfca3b0e37d877bb3cb247fb8b2ad810dd47f Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Mon, 9 Jun 2003 18:00:00 +0200 Subject: [PATCH] Version 1.2.1 - Fixed OSD access in case none of the devices provides one (thanks to Axel Gruber for reporting this one). - Fixed editing channels ('timers.conf' was not written after a channel has been modified, which could result in errors upon the next start of VDR). - Fixed a crash when canceling a newly created timer (thanks to Thomas Schmidt for reporting this one). - Completed Hungarian language texts (thanks to Istvan Koenigsberger and Guido Josten). - Fixed device handling in the CICAM menu in case a VDR instance was started with a specific device using the -D option (thanks to Gerald Raaf for reporting ths one). - Initializing the current channel to '1' to avoid a crash in creating a new timer in case there is no device in the system that can actually receive any channel (thanks to Malcolm Caldwell for reporting this one). - Some corrections to the Finnish OSD texts (thanks to Niko Tarnanen and Rolf Ahrenberg). --- CONTRIBUTORS | 8 ++++++ HISTORY | 19 +++++++++++++ config.h | 6 ++-- device.c | 4 +-- i18n.c | 60 ++++++++++++++++++++-------------------- menu.c | 78 +++++++++++++++++++++------------------------------- osd.c | 22 +++++++++------ svdrp.c | 3 +- 8 files changed, 110 insertions(+), 90 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index ee0c0d4a..7e5886d2 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -90,6 +90,7 @@ Peter Hofmann Axel Gruber for his support in keeping the Premiere World channels up to date in 'channels.conf' for helping to debug support for Viaccess CAMs + for reporting a problem in case none of the devices provides an OSD Arnold Niessen for translating OSD texts to the Dutch language @@ -370,6 +371,8 @@ Gerald Raaf for helping to fix the still picture workaround in case the progress display is active for his support in keeping the Premiere World channels up to date in 'channels.conf' + for reporting a problem in device handling in the CICAM menu in case a VDR + instance was started with a specific device using the -D option Andreas Roedl for adding some DVB-T channels for Berlin (Germany) to channels.conf.terr @@ -617,6 +620,8 @@ Sascha Volkenandt Malcolm Caldwell for modifying LOF handling to allow for C-band reception + for reporting a crash in creating a new timer in case there is no device in the + system that can actually receive any channel Ludwig Nussel for making the LIRC thread avoid high CPU load in case the connection to LIRC gets lost @@ -711,3 +716,6 @@ Karim Afifi Jon Burgess for pointing out a problem with NPTL ("Native Posix Thread Library") + +Thomas Schmidt + for reporting a crash when cancelling a newly created timer diff --git a/HISTORY b/HISTORY index 4eca5f52..c1a82226 100644 --- a/HISTORY +++ b/HISTORY @@ -2234,3 +2234,22 @@ Video Disk Recorder Revision History (thanks to Jon Burgess for pointing this out). - Some corrections to the Finnish OSD texts (thanks to Jaakko Hyvätti). - Officially released as version 1.2.0. + +2003-06-09: Version 1.2.1 + +- Fixed OSD access in case none of the devices provides one (thanks to Axel + Gruber for reporting this one). +- Fixed editing channels ('timers.conf' was not written after a channel has + been modified, which could result in errors upon the next start of VDR). +- Fixed a crash when cancelling a newly created timer (thanks to Thomas Schmidt + for reporting this one). +- Completed Hungarian language texts (thanks to Istvan Koenigsberger and Guido + Josten). +- Fixed device handling in the CICAM menu in case a VDR instance was started + with a specific device using the -D option (thanks to Gerald Raaf for reporting + ths one). +- Initializing the current channel to '1' to avoid a crash in creating a new + timer in case there is no device in the system that can actually receive any + channel (thanks to Malcolm Caldwell for reporting this one). +- Some corrections to the Finnish OSD texts (thanks to Niko Tarnanen and Rolf + Ahrenberg). diff --git a/config.h b/config.h index 409e22fa..29c058ef 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.163 2003/05/31 09:10:58 kls Exp $ + * $Id: config.h 1.164 2003/06/06 12:28:20 kls Exp $ */ #ifndef __CONFIG_H @@ -19,8 +19,8 @@ #include "device.h" #include "tools.h" -#define VDRVERSION "1.2.0" -#define VDRVERSNUM 10200 // Version * 10000 + Major * 100 + Minor +#define VDRVERSION "1.2.1" +#define VDRVERSNUM 10201 // Version * 10000 + Major * 100 + Minor #define MAXPRIORITY 99 #define MAXLIFETIME 99 diff --git a/device.c b/device.c index 58f9bf0a..f43870ad 100644 --- a/device.c +++ b/device.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: device.c 1.44 2003/05/25 10:57:59 kls Exp $ + * $Id: device.c 1.45 2003/06/08 09:19:59 kls Exp $ */ #include "device.h" @@ -28,7 +28,7 @@ int cDevice::numDevices = 0; int cDevice::useDevice = 0; int cDevice::nextCardIndex = 0; -int cDevice::currentChannel = 0; +int cDevice::currentChannel = 1; cDevice *cDevice::device[MAXDEVICES] = { NULL }; cDevice *cDevice::primaryDevice = NULL; diff --git a/i18n.c b/i18n.c index 9b6c191d..f50a2301 100644 --- a/i18n.c +++ b/i18n.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: i18n.c 1.125 2003/06/01 08:49:47 kls Exp $ + * $Id: i18n.c 1.128 2003/06/09 09:49:29 kls Exp $ * * Translations provided by: * @@ -222,7 +222,7 @@ const tI18nPhrase Phrases[] = { "Entoles gia egrafes", "Inspelningskommandon", "",// TODO - "",// TODO + "Parancsok a felvett filmekhez", "Ordres de gravació", }, { "Edit channel", @@ -733,7 +733,7 @@ const tI18nPhrase Phrases[] = { "Epanafora", "Ĺterställ", "",//TODO - "",//TODO + "Reset", "Reiniciar", }, // Confirmations: @@ -932,7 +932,7 @@ const tI18nPhrase Phrases[] = { "Pressione qualquer tecla para cancelar", "Appuyez sur une touche pour annuler l'arręt", "Trykk en tast for ikke ĺ slĺ av", - "Peru sammutus painamalla jotain näppäintä", + "Peru sammutus painamalla mitä tahansa näppäintä", "Dowolny przycisk zatrzyma wylaczanie", "Pulse una tecla para interrumpir apagar", "Piese ena pliktro na akirothei o termatismos", @@ -1007,7 +1007,7 @@ const tI18nPhrase Phrases[] = { "Pigi", "Källa", "",//TODO - "",//TODO + "Forrás", "Origen", }, { "Srate", @@ -1587,7 +1587,7 @@ const tI18nPhrase Phrases[] = { "To kanali den ine diathesimo", "Kanalen ej tillgänglig!", "",//TODO - "",//TODO + "A csatorna nem elérhetö", "Canal no disponible!", }, { "Channel settings are not unique!", @@ -1604,7 +1604,7 @@ const tI18nPhrase Phrases[] = { "Oi rithmiseis tou kanaliou simpiptoun me allo!", "Kanalinställningarna är ej unika!", "",//TODO - "",//TODO + "A csatornabeállítások nem egyértelmüek", "Propietats del canal duplicades!", }, { "Channel locked (recording)!", @@ -1655,7 +1655,7 @@ const tI18nPhrase Phrases[] = { "Den exoun oristei simeia gia epexsergasia", "Det finns inga redigeringsmärken",//TODO "",//TODO - "",//TODO + "A vágópont nincs kijelölve",//TODO "No hi ha marques d'edició definides", }, { "Can't start editing process!", @@ -1740,7 +1740,7 @@ const tI18nPhrase Phrases[] = { "Den mpori na aniksi to CAM menou!", "Det gĺr inte att öppna CAM menyn!", "",//TODO - "",//TODO + "A CAM-Menü nem nyitható", "No puc obrir el menú de la CAM!", }, { "Can't reset CAM!", @@ -1757,7 +1757,7 @@ const tI18nPhrase Phrases[] = { "Adinato na gini epanafora sto CAM", "Kan inte ĺterställa CAM!", "",//TODO - "",//TODO + "A CAM-Reset nem sikerült", "No puc reiniciar la CAM!", }, { "CAM has been reset", @@ -1774,7 +1774,7 @@ const tI18nPhrase Phrases[] = { "Sto CAM egine apanafora", "CA modulen har ĺterställts", "",//TODO - "",//TODO + "A CAM vissza lett állítva", "CAM reiniciada", }, // Setup pages: @@ -2405,7 +2405,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "Prioritet för direktinspelning", "",// TODO - "",// TODO + "Szünet prioritás", "Prioritat de la pausa", }, { "Setup.Recording$Pause lifetime (d)", @@ -2422,7 +2422,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "Livstid för direktinspelning (dagar)", "",// TODO - "",// TODO + "Szünet élettartama", "Durada de la pausa (d)", }, { "Setup.Recording$Use episode name", @@ -2592,7 +2592,7 @@ const tI18nPhrase Phrases[] = { "Resume ID",// TODO "Ĺteruppta ID", "Resume ID",// TODO - "Resume ID",// TODO + "Lejátszás ID", "ID de Continuar", }, { "Setup.Miscellaneous$Min. event timeout (min)", @@ -2696,7 +2696,7 @@ const tI18nPhrase Phrases[] = { "",// TODO " abcdefghijklmnopqrstuvxyzĺäö0123456789-.#~", " abcdefghijklmnopqrstuvwxyz0123456789-.#~", - " aábcdeéfghijklmnoóöpqrstuúüvwxyz0123456789-.,#~", + " aábcdeéfghiíjklmnoóöpqrstuúüvwxyz0123456789-.,#~", " aŕbcçdeéčfghiíjklmnoňpqrstuúvwxyz0123456789-.,#~_ˇ", }, // Learning keys: @@ -2742,7 +2742,7 @@ const tI18nPhrase Phrases[] = { "Pressione qualquer tecla do telecomando", "Appuyer sur une touche de la télécommande", "Trykk en av tastene pĺ fjernkontrollen", - "Paina jotain kaukosäätimen näppäintä", + "Paina mitä tahansa kaukosäätimen näppäintä", "Nacisnac klawisz pilota", "Pulse una tecla en el telemando", "Piese ena pliktro sto tilexiristirio", @@ -2901,7 +2901,7 @@ const tI18nPhrase Phrases[] = { "Pata 'Menou' gia prosperasi aftou tou pliktrou", "Tryck 'Meny' för att hoppa över denna knapp.", "",// TODO - "",// TODO + "A Menü gombot nyomni ennek a gombnak a kihagyásához", "Premeu 'Menú' per obviar aquesta tecla", }, { "Phase 3: Saving key codes", @@ -3140,7 +3140,7 @@ const tI18nPhrase Phrases[] = { "Anametadosi", "Spela upp", "",// TODO - "",// TODO + "Lejátszás", "Reproduir", }, { "Pause", @@ -3157,7 +3157,7 @@ const tI18nPhrase Phrases[] = { "Dialima", "Pausa", "",// TODO - "",// TODO + "Szünet", "Pausa", }, { "Stop", @@ -3174,7 +3174,7 @@ const tI18nPhrase Phrases[] = { "Terma", "Stoppa", "",// TODO - "",// TODO + "Stop", "Aturar", }, { "Record", @@ -3191,7 +3191,7 @@ const tI18nPhrase Phrases[] = { "Egrafi", "Spela in", "",// TODO - "",// TODO + "Felvenni", "Gravar", }, { "FastFwd", @@ -3208,7 +3208,7 @@ const tI18nPhrase Phrases[] = { "Girisma mprosta", "Snabbspolning framĺt", "",// TODO - "",// TODO + "Elöre pörgetni", "Endavant rŕpidament", }, { "FastRew", @@ -3225,7 +3225,7 @@ const tI18nPhrase Phrases[] = { "Girisma piso", "Snabbspolning bakĺt", "",// TODO - "",// TODO + "Vissza pörgetni", "Enrera rŕpidament", }, { "Power", @@ -3259,7 +3259,7 @@ const tI18nPhrase Phrases[] = { "Kanali+", "Kanal+", "",// TODO - "",// TODO + "Csatorna+", "Canal +", }, { "Channel-", @@ -3276,7 +3276,7 @@ const tI18nPhrase Phrases[] = { "Kanali-", "Kanal-", "",// TODO - "",// TODO + "Csatorna-", "Canal -", }, { "Volume+", @@ -3379,7 +3379,7 @@ const tI18nPhrase Phrases[] = { "klisto", "av", "",// TODO - "",// TODO + "ki", "off", }, { "none", @@ -3396,7 +3396,7 @@ const tI18nPhrase Phrases[] = { "kanena", "ingen", "",// TODO - "",// TODO + "semmi", "cap", }, { "auto", @@ -3413,7 +3413,7 @@ const tI18nPhrase Phrases[] = { "aftomato", "automatisk", "",// TODO - "",// TODO + "auto", "auto", }, { "top", @@ -3685,7 +3685,7 @@ const tI18nPhrase Phrases[] = { "",// TODO "Pausar direktinspelningen", "",// TODO - "",// TODO + "Az élö adás megállítva...", "Pausa d'emissió en directe...", }, { "This plugin has no setup parameters!", @@ -3702,7 +3702,7 @@ const tI18nPhrase Phrases[] = { "Afto to plugin den exi parametrous", "Den här modulen har inga parametrar", "",// TODO - "",// TODO + "Ennek a plugin-nak nincs setup-parametere!", "Aquest plugin no admet configuració!", }, { NULL } diff --git a/menu.c b/menu.c index ecf2493c..5a509345 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 1.253 2003/05/30 09:53:57 kls Exp $ + * $Id: menu.c 1.256 2003/06/07 12:31:57 kls Exp $ */ #include "menu.h" @@ -615,6 +615,7 @@ eOSState cMenuEditChannel::ProcessKey(eKeys Key) if (channel) { *channel = data; isyslog("edited channel %d %s", channel->Number(), data.ToText()); + Timers.Save(); state = osBack; } else { @@ -834,21 +835,21 @@ private: cTimer *timer; cTimer data; int channel; - bool deleteIfCancelled; + bool addIfConfirmed; cMenuEditDateItem *firstday; void SetFirstDayItem(void); public: - cMenuEditTimer(int Index, bool New = false); + cMenuEditTimer(cTimer *Timer, bool New = false); virtual ~cMenuEditTimer(); virtual eOSState ProcessKey(eKeys Key); }; -cMenuEditTimer::cMenuEditTimer(int Index, bool New) +cMenuEditTimer::cMenuEditTimer(cTimer *Timer, bool New) :cOsdMenu(tr("Edit timer"), 12) { firstday = NULL; - timer = Timers.Get(Index); - deleteIfCancelled = New; + timer = Timer; + addIfConfirmed = New; if (timer) { data = *timer; if (New) @@ -869,12 +870,8 @@ cMenuEditTimer::cMenuEditTimer(int Index, bool New) cMenuEditTimer::~cMenuEditTimer() { - if (timer && deleteIfCancelled) { - int Index = timer->Index(); - Timers.Del(timer); - Timers.Save(); - isyslog("timer %d deleted", Index + 1); - } + if (timer && addIfConfirmed) + delete timer; // apparently it wasn't confirmed Timers.DecBeingEdited(); } @@ -908,14 +905,18 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key) } if (!*data.file) strcpy(data.file, data.Channel()->Name()); - if (timer && memcmp(timer, &data, sizeof(data)) != 0) { - *timer = data; - if (timer->active) - timer->active = 1; // allows external programs to mark active timers with values > 1 and recognize if the user has modified them + if (timer) { + if (memcmp(timer, &data, sizeof(data)) != 0) { + *timer = data; + if (timer->active) + timer->active = 1; // allows external programs to mark active timers with values > 1 and recognize if the user has modified them + } + if (addIfConfirmed) + Timers.Add(timer); Timers.Save(); - isyslog("timer %d modified (%s)", timer->Index() + 1, timer->active ? "active" : "inactive"); + isyslog("timer %d %s (%s)", timer->Index() + 1, addIfConfirmed ? "added" : "modified", timer->active ? "active" : "inactive"); + addIfConfirmed = false; } - deleteIfCancelled = false; } return osBack; case kRed: @@ -1033,19 +1034,14 @@ eOSState cMenuTimers::Edit(void) if (HasSubMenu() || Count() == 0) return osContinue; isyslog("editing timer %d", CurrentTimer()->Index() + 1); - return AddSubMenu(new cMenuEditTimer(CurrentTimer()->Index())); + return AddSubMenu(new cMenuEditTimer(CurrentTimer())); } eOSState cMenuTimers::New(void) { if (HasSubMenu()) return osContinue; - cTimer *timer = new cTimer; - Timers.Add(timer); - Add(new cMenuTimerItem(timer), true); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - return AddSubMenu(new cMenuEditTimer(timer->Index(), true)); + return AddSubMenu(new cMenuEditTimer(new cTimer, true)); } eOSState cMenuTimers::Delete(void) @@ -1094,8 +1090,7 @@ eOSState cMenuTimers::Summary(void) eOSState cMenuTimers::ProcessKey(eKeys Key) { - cTimer *ti = HasSubMenu() ? CurrentTimer() : NULL; - int TimerNumber = ti ? ti->Index() : -1; + int TimerNumber = HasSubMenu() ? Count() : -1; eOSState state = cOsdMenu::ProcessKey(Key); if (state == osUnknown) { @@ -1112,9 +1107,9 @@ eOSState cMenuTimers::ProcessKey(eKeys Key) default: break; } } - if (TimerNumber >= 0 && !HasSubMenu() && !Timers.Get(TimerNumber)) { - // a newly created timer wasn't confirmed with Ok - cOsdMenu::Del(Current()); + if (TimerNumber >= 0 && !HasSubMenu() && Timers.Get(TimerNumber)) { + // a newly created timer was confirmed with Ok + Add(new cMenuTimerItem(Timers.Get(TimerNumber)), true); Display(); } return state; @@ -1274,16 +1269,11 @@ eOSState cMenuWhatsOn::Record(void) if (item) { cTimer *timer = new cTimer(item->eventInfo); cTimer *t = Timers.GetTimer(timer); - if (!t) { - Timers.Add(timer); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - } - else { + if (t) { delete timer; timer = t; } - return AddSubMenu(new cMenuEditTimer(timer->Index(), !t)); + return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; } @@ -1408,16 +1398,11 @@ eOSState cMenuSchedule::Record(void) if (item) { cTimer *timer = new cTimer(item->eventInfo); cTimer *t = Timers.GetTimer(timer); - if (!t) { - Timers.Add(timer); - Timers.Save(); - isyslog("timer %d added", timer->Index() + 1); - } - else { + if (t) { delete timer; timer = t; } - return AddSubMenu(new cMenuEditTimer(timer->Index(), !t)); + return AddSubMenu(new cMenuEditTimer(timer, !t)); } return osContinue; } @@ -2124,8 +2109,9 @@ cMenuSetupCICAM::cMenuSetupCICAM(void) for (int d = 0; d < cDevice::NumDevices(); d++) { for (int i = 0; i < 2; i++) { char buffer[32]; - snprintf(buffer, sizeof(buffer), "%s%d %d", tr("Setup.CICAM$CICAM DVB"), d + 1, i + 1); - Add(new cMenuEditCaItem(buffer, &data.CaCaps[d][i])); + int CardIndex = cDevice::GetDevice(d)->CardIndex(); + snprintf(buffer, sizeof(buffer), "%s%d %d", tr("Setup.CICAM$CICAM DVB"), CardIndex + 1, i + 1); + Add(new cMenuEditCaItem(buffer, &data.CaCaps[CardIndex][i])); } } SetHelpKeys(); diff --git a/osd.c b/osd.c index 9d8b72db..8f3343b8 100644 --- a/osd.c +++ b/osd.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: osd.c 1.42 2003/05/03 14:46:38 kls Exp $ + * $Id: osd.c 1.43 2003/06/04 16:13:00 kls Exp $ */ #include "osd.h" @@ -99,6 +99,8 @@ void cOsd::Open(int w, int h) //XXX osd = OpenRaw(x, y); //XXX TODO this should be transferred to the places where the individual windows are requested (there's too much detailed knowledge here!) + if (!osd) + return; if (h / lineHeight == 5) { //XXX channel display osd->Create(0, 0, w, h, 4); } @@ -145,7 +147,8 @@ void cOsd::Clear(void) Fill(0, 0, cols, rows, clrBackground); refresh(); #else - osd->Clear(); + if (osd) + osd->Clear(); #endif } @@ -161,14 +164,16 @@ void cOsd::Fill(int x, int y, int w, int h, eDvbColor color) } wsyncup(window); // shouldn't be necessary because of 'syncok()', but w/o it doesn't work #else - osd->Fill(x * charWidth, y * lineHeight, (x + w) * charWidth - 1, (y + h) * lineHeight - 1, color); + if (osd) + osd->Fill(x * charWidth, y * lineHeight, (x + w) * charWidth - 1, (y + h) * lineHeight - 1, color); #endif } void cOsd::SetBitmap(int x, int y, const cBitmap &Bitmap) { #ifndef DEBUG_OSD - osd->SetBitmap(x, y, Bitmap); + if (osd) + osd->SetBitmap(x, y, Bitmap); #endif } @@ -200,7 +205,7 @@ int cOsd::Width(unsigned char c) #ifdef DEBUG_OSD return 1; #else - return osd->Width(c); + return osd ? osd->Width(c) : 1; #endif } @@ -209,7 +214,7 @@ int cOsd::WidthInCells(const char *s) #ifdef DEBUG_OSD return strlen(s); #else - return (osd->Width(s) + charWidth - 1) / charWidth; + return osd ? (osd->Width(s) + charWidth - 1) / charWidth : strlen(s); #endif } @@ -218,7 +223,7 @@ eDvbFont cOsd::SetFont(eDvbFont Font) #ifdef DEBUG_OSD return Font; #else - return osd->SetFont(Font); + return osd ? osd->SetFont(Font) : Font; #endif } @@ -231,7 +236,8 @@ void cOsd::Text(int x, int y, const char *s, eDvbColor colorFg, eDvbColor colorB wmove(window, y, x); // ncurses wants 'y' before 'x'! waddnstr(window, s, cols - x); #else - osd->Text(x * charWidth, y * lineHeight, s, colorFg, colorBg); + if (osd) + osd->Text(x * charWidth, y * lineHeight, s, colorFg, colorBg); #endif } diff --git a/svdrp.c b/svdrp.c index 6dafddd1..e9f22161 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 1.51 2003/04/27 14:21:07 kls Exp $ + * $Id: svdrp.c 1.52 2003/06/06 13:30:52 kls Exp $ */ #include "svdrp.h" @@ -790,6 +790,7 @@ void cSVDRP::CmdMODC(const char *Option) Channels.ReNumber(); Channels.Save(); isyslog("modifed channel %d %s", channel->Number(), channel->ToText()); + Timers.Save(); Reply(250, "%d %s", channel->Number(), channel->ToText()); } else