1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed moving channels between number groups in SVDRP's MOVC command and the Channels menu, in case a channel is moved to a higher number and into a numbered group

This commit is contained in:
Klaus Schmidinger 2020-04-11 09:22:05 +02:00
parent f63a066b98
commit 6e0f5287ea
6 changed files with 38 additions and 6 deletions

View File

@ -2918,6 +2918,7 @@ Manuel Reimer <Manuel.Reimer@gmx.de>
order to avoid discontinuities order to avoid discontinuities
for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly for setting the environment variables HOME, USER, LOGNAME and SHELL accordingly
when switching to a less privileged user id when switching to a less privileged user id
for reporting a bug in moving channels between number groups in SVDRP's MOVC command
Rene van den Braken <rene@vandenbraken.name> Rene van den Braken <rene@vandenbraken.name>
for reporting a bug in writing the PCR pid into the PMT in for reporting a bug in writing the PCR pid into the PMT in

View File

@ -9419,3 +9419,9 @@ Video Disk Recorder Revision History
the call is now automatically forwarded to QueueMessage(). the call is now automatically forwarded to QueueMessage().
- Fixed handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting - Fixed handling the S2SatelliteDeliverySystemDescriptor for transponders broadcasting
in "backwards compatibility mode" according to ETSI EN 300 468 (thanks to Onur Sentürk). in "backwards compatibility mode" according to ETSI EN 300 468 (thanks to Onur Sentürk).
2020-04-11:
- Fixed moving channels between number groups in SVDRP's MOVC command and the Channels
menu, in case a channel is moved to a higher number and into a numbered group
(reported by Manuel Reimer).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.c 4.5 2017/06/10 15:08:56 kls Exp $ * $Id: channels.c 4.6 2020/04/11 09:22:05 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
@ -946,6 +946,25 @@ void cChannels::ReNumber(void)
} }
} }
bool cChannels::MoveNeedsDecrement(cChannel *From, cChannel *To)
{
int Number = From->Number();
if (Number < To->Number()) {
for (cChannel *Channel = Next(From); Channel; Channel = Next(Channel)) {
if (Channel == To)
break;
if (Channel->GroupSep()) {
if (Channel->Number() > Number)
Number = Channel->Number();
}
else
Number++;
}
return Number == To->Number();
}
return false;
}
void cChannels::Del(cChannel *Channel) void cChannels::Del(cChannel *Channel)
{ {
UnhashChannel(Channel); UnhashChannel(Channel);

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.h 4.3 2017/06/10 15:06:40 kls Exp $ * $Id: channels.h 4.4 2020/04/11 09:22:05 kls Exp $
*/ */
#ifndef __CHANNELS_H #ifndef __CHANNELS_H
@ -230,6 +230,7 @@ public:
int GetNextNormal(int Idx) const; ///< Get next normal channel (not group) int GetNextNormal(int Idx) const; ///< Get next normal channel (not group)
int GetPrevNormal(int Idx) const; ///< Get previous normal channel (not group) int GetPrevNormal(int Idx) const; ///< Get previous normal channel (not group)
void ReNumber(void); ///< Recalculate 'number' based on channel type void ReNumber(void); ///< Recalculate 'number' based on channel type
bool MoveNeedsDecrement(cChannel *From, cChannel *To); // Detect special case when moving a channel (closely related to Renumber())
void Del(cChannel *Channel); ///< Delete the given Channel from the list void Del(cChannel *Channel); ///< Delete the given Channel from the list
const cChannel *GetByNumber(int Number, int SkipGap = 0) const; const cChannel *GetByNumber(int Number, int SkipGap = 0) const;
cChannel *GetByNumber(int Number, int SkipGap = 0) { return const_cast<cChannel *>(static_cast<const cChannels *>(this)->GetByNumber(Number, SkipGap)); } cChannel *GetByNumber(int Number, int SkipGap = 0) { return const_cast<cChannel *>(static_cast<const cChannels *>(this)->GetByNumber(Number, SkipGap)); }

9
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 4.80 2019/05/28 15:24:43 kls Exp $ * $Id: menu.c 4.81 2020/04/11 09:22:05 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -516,7 +516,6 @@ eOSState cMenuChannels::Delete(void)
Channels->Del(Channel); Channels->Del(Channel);
cOsdMenu::Del(Index); cOsdMenu::Del(Index);
Propagate(Channels); Propagate(Channels);
Channels->SetModifiedByUser();
isyslog("channel %d deleted", DeletedChannel); isyslog("channel %d deleted", DeletedChannel);
Deleted = true; Deleted = true;
if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) { if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) {
@ -541,10 +540,14 @@ void cMenuChannels::Move(int From, int To)
if (FromChannel && ToChannel) { if (FromChannel && ToChannel) {
int FromNumber = FromChannel->Number(); int FromNumber = FromChannel->Number();
int ToNumber = ToChannel->Number(); int ToNumber = ToChannel->Number();
if (Channels->MoveNeedsDecrement(FromChannel, ToChannel)) {
ToChannel = Channels->Prev(ToChannel); // cListBase::Move() doesn't know about the channel list's numbered groups!
To--;
}
Channels->Move(FromChannel, ToChannel); Channels->Move(FromChannel, ToChannel);
cOsdMenu::Move(From, To); cOsdMenu::Move(From, To);
SetCurrent(Get(To));
Propagate(Channels); Propagate(Channels);
Channels->SetModifiedByUser();
isyslog("channel %d moved to %d", FromNumber, ToNumber); isyslog("channel %d moved to %d", FromNumber, ToNumber);
if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) { if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) {
if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring()) if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())

View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 4.39 2019/05/06 15:11:15 kls Exp $ * $Id: svdrp.c 4.40 2020/04/11 09:22:05 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -2087,6 +2087,8 @@ void cSVDRPServer::CmdMOVC(const char *Option)
int FromNumber = FromChannel->Number(); int FromNumber = FromChannel->Number();
int ToNumber = ToChannel->Number(); int ToNumber = ToChannel->Number();
if (FromNumber != ToNumber) { if (FromNumber != ToNumber) {
if (Channels->MoveNeedsDecrement(FromChannel, ToChannel))
ToChannel = Channels->Prev(ToChannel); // cListBase::Move() doesn't know about the channel list's numbered groups!
Channels->Move(FromChannel, ToChannel); Channels->Move(FromChannel, ToChannel);
Channels->ReNumber(); Channels->ReNumber();
Channels->SetModifiedByUser(); Channels->SetModifiedByUser();