summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouis <louis.braun@gmx.de>2016-03-03 23:37:23 +0100
committerlouis <louis.braun@gmx.de>2016-03-03 23:37:23 +0100
commitcdc1c10204a7444b7178626ae4b3b36a129e96da (patch)
tree91044dae4adbb00616f75ec24d2ccb588b94c4be
parentf2c492d81ced0ff587af5bcb5a88e66c38169596 (diff)
downloadvdr-plugin-skindesigner-cdc1c10204a7444b7178626ae4b3b36a129e96da.tar.gz
vdr-plugin-skindesigner-cdc1c10204a7444b7178626ae4b3b36a129e96da.tar.bz2
fixed possible deadlock when closing osd with blinking element
-rw-r--r--coreengine/animation.c2
-rw-r--r--coreengine/area.h3
-rw-r--r--coreengine/view.c5
-rw-r--r--coreengine/viewelement.c6
-rw-r--r--coreengine/viewelement.h1
5 files changed, 15 insertions, 2 deletions
diff --git a/coreengine/animation.c b/coreengine/animation.c
index 2e703ee..3e40a4a 100644
--- a/coreengine/animation.c
+++ b/coreengine/animation.c
@@ -342,7 +342,7 @@ void cAnimation::Blink(void) {
Sleep(freq);
if (Running()) {
blinkable->DoBlink(blinkFunc, blinkOn);
- blinkable->Flush();
+ blinkable->Flush();
}
blinkOn = !blinkOn;
}
diff --git a/coreengine/area.h b/coreengine/area.h
index 5f3a8e9..256feda 100644
--- a/coreengine/area.h
+++ b/coreengine/area.h
@@ -42,6 +42,7 @@ public:
bool ActiveTab(void) { return activeTab; };
virtual int GetWidth(void) { return 0; };
virtual void Cache(void) {};
+ virtual void StopBlinkers(void) {};
virtual void Close(void) {};
virtual void Clear(void) {};
virtual void Hide(void) {};
@@ -82,7 +83,6 @@ private:
void CreatePixmap(cRect drawPort = cRect::Null);
void SetScrollFunc(void);
void StartBlinkers(void);
- void StopBlinkers(void);
public:
cArea(void);
cArea(const cArea &other);
@@ -131,6 +131,7 @@ public:
//Blinkable
int BlinkFreq(int func);
void DoBlink(int func, bool on);
+ void StopBlinkers(void);
//Common
const char *Name(void) { return attribs->Name(); };
bool BackgroundArea(void) { return attribs->BackgroundArea(); };
diff --git a/coreengine/view.c b/coreengine/view.c
index 0a323bc..2aba313 100644
--- a/coreengine/view.c
+++ b/coreengine/view.c
@@ -215,6 +215,11 @@ void cView::Render(int ve, bool force) {
}
void cView::Close(void) {
+ for (int i=0; i < numViewElements; i++) {
+ if (!viewElements[i])
+ continue;
+ viewElements[i]->StopBlinking();
+ }
delete fader;
fader = NULL;
delete shifter;
diff --git a/coreengine/viewelement.c b/coreengine/viewelement.c
index 69377d0..cf05733 100644
--- a/coreengine/viewelement.c
+++ b/coreengine/viewelement.c
@@ -319,6 +319,12 @@ void cViewElement::Close(void) {
blocked = false;
}
+void cViewElement::StopBlinking(void) {
+ for (cAreaNode *node = areaNodes.First(); node; node = areaNodes.Next(node)) {
+ node->StopBlinkers();
+ }
+}
+
void cViewElement::Render(void) {
if (!dirty || blocked)
return;
diff --git a/coreengine/viewelement.h b/coreengine/viewelement.h
index 1f7db74..dedbcbf 100644
--- a/coreengine/viewelement.h
+++ b/coreengine/viewelement.h
@@ -61,6 +61,7 @@ public:
void SetAreaHeight(int height);
void Cache(void);
virtual void Close(void);
+ void StopBlinking(void);
virtual void Clear(void);
void Hide(void);
void Show(void);