aboutsummaryrefslogtreecommitdiff
path: root/src/styleengine.cc
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2013-10-07 11:36:31 +0200
committerSebastian Geerken <devnull@localhost>2013-10-07 11:36:31 +0200
commitcfdf262f3ffe5f818ebf318d68d03b698ff3e363 (patch)
treef094ee2f24091f8de93b17c78aed0a3f325e75a1 /src/styleengine.cc
parent79c24d20a6dfa62e72085a45a29e148ad86d7009 (diff)
Cache client is stopped when StyleImage is deleted.
Diffstat (limited to 'src/styleengine.cc')
-rw-r--r--src/styleengine.cc40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/styleengine.cc b/src/styleengine.cc
index f3fd2934..efd4d629 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -21,6 +21,44 @@
using namespace lout::misc;
using namespace dw::core::style;
+/**
+ * Signal handler for "delete": This handles the case when an instance
+ * of StyleImage is deleted, possibly when the cache client is still
+ * active.
+ *
+ * \todo Not neccessary for dw::Image? (dw::Image also implements
+ * lout::signal::ObservedObject.)
+ */
+class StyleImageDeletionReceiver:
+ public lout::signal::ObservedObject::DeletionReceiver
+{
+ int clientKey;
+
+public:
+ StyleImageDeletionReceiver (int clientKey);
+ ~StyleImageDeletionReceiver ();
+
+ void deleted (lout::signal::ObservedObject *object);
+};
+
+StyleImageDeletionReceiver::StyleImageDeletionReceiver (int clientKey)
+{
+ this->clientKey = clientKey;
+}
+
+StyleImageDeletionReceiver::~StyleImageDeletionReceiver ()
+{
+ printf ("StyleImageDeletionReceiver deleted.\n");
+}
+
+void StyleImageDeletionReceiver::deleted (lout::signal::ObservedObject *object)
+{
+ a_Capi_stop_client (clientKey, 0);
+ delete this;
+}
+
+// ----------------------------------------------------------------------
+
StyleEngine::StyleEngine (dw::core::Layout *layout) {
StyleAttrs style_attrs;
FontAttrs font_attrs;
@@ -477,6 +515,8 @@ void StyleEngine::apply (int i, StyleAttrs *attrs, CssPropertyList *props,
if ((clientKey = a_Capi_open_url(web, NULL, NULL)) != 0) {
a_Bw_add_client(bw, clientKey, 0);
a_Bw_add_url(bw, url);
+ attrs->backgroundImage->connectDeletion
+ (new StyleImageDeletionReceiver (clientKey));
}
}
break;