aboutsummaryrefslogtreecommitdiff
path: root/dw
diff options
context:
space:
mode:
authorSebastian Geerken <devnull@localhost>2014-05-06 20:23:53 +0200
committerSebastian Geerken <devnull@localhost>2014-05-06 20:23:53 +0200
commit5e8dec509c8402a8f761e3156bd22278c332c5fc (patch)
tree41a62bd0d660b93a5758a9b36cbfb6e6046f741d /dw
parente0d27594996a9aca98ae1c25b64f14ff2dfeb1de (diff)
New signal "resizeQueued" for Layout. It is used by ComplexButtonResource, instead of "canvasSizeChange"; this seems to fix a CPU hogging problem.
Diffstat (limited to 'dw')
-rw-r--r--dw/layout.cc24
-rw-r--r--dw/layout.hh8
-rw-r--r--dw/ui.cc16
-rw-r--r--dw/ui.hh2
-rw-r--r--dw/widget.cc2
5 files changed, 37 insertions, 15 deletions
diff --git a/dw/layout.cc b/dw/layout.cc
index b93a1b70..f9b3f763 100644
--- a/dw/layout.cc
+++ b/dw/layout.cc
@@ -91,6 +91,10 @@ void Layout::LayoutImgRenderer::draw (int x, int y, int width, int height)
// ----------------------------------------------------------------------
+void Layout::Receiver::resizeQueued (bool extremesChanged)
+{
+}
+
void Layout::Receiver::canvasSizeChanged (int width, int ascent, int descent)
{
}
@@ -110,6 +114,10 @@ bool Layout::Emitter::emitToReceiver (lout::signal::Receiver *receiver,
((Integer*)argv[2])->getValue ());
break;
+ case RESIZE_QUEUED:
+ layoutReceiver->resizeQueued (((Boolean*)argv[0])->getValue ());
+ break;
+
default:
misc::assertNotReached ();
}
@@ -117,6 +125,13 @@ bool Layout::Emitter::emitToReceiver (lout::signal::Receiver *receiver,
return false;
}
+void Layout::Emitter::emitResizeQueued (bool extremesChanged)
+{
+ Boolean ec (extremesChanged);
+ Object *argv[1] = { &ec };
+ emitVoid (RESIZE_QUEUED, 1, argv);
+}
+
void Layout::Emitter::emitCanvasSizeChanged (int width,
int ascent, int descent)
{
@@ -963,9 +978,10 @@ void Layout::queueDrawExcept (int x, int y, int width, int height,
queueDraw (ix2, iy1, x + width - ix2, iy2 - iy1);
}
-void Layout::queueResize ()
+void Layout::queueResize (bool extremesChanged)
{
- DBG_OBJ_MSG ("resize", 0, "<b>queueResize</b>");
+ DBG_OBJ_MSGF ("resize", 0, "<b>queueResize</b> (%s)",
+ extremesChanged ? "true" : "false");
DBG_OBJ_MSG_START ();
if (resizeIdleId == -1) {
@@ -975,6 +991,8 @@ void Layout::queueResize ()
DBG_OBJ_MSGF ("resize", 1, "setting resizeIdleId = %d", resizeIdleId);
}
+ emitter.emitResizeQueued (extremesChanged);
+
DBG_OBJ_MSG_END ();
}
@@ -1261,7 +1279,7 @@ void Layout::viewportSizeChanged (View *view, int width, int height)
// similar to addWidget()
topLevel->queueResize (-1, false);
else
- queueResize ();
+ queueResize (false);
}
viewportWidth = width;
diff --git a/dw/layout.hh b/dw/layout.hh
index 6b6ceadb..2120d877 100644
--- a/dw/layout.hh
+++ b/dw/layout.hh
@@ -42,11 +42,12 @@ public:
/**
* \brief Receiver interface different signals.
*
- * May be extended
+ * May be extended.
*/
class Receiver: public lout::signal::Receiver
{
public:
+ virtual void resizeQueued (bool extremesChanged);
virtual void canvasSizeChanged (int width, int ascent, int descent);
};
@@ -126,7 +127,7 @@ private:
class Emitter: public lout::signal::Emitter
{
private:
- enum { CANVAS_SIZE_CHANGED };
+ enum { RESIZE_QUEUED, CANVAS_SIZE_CHANGED };
protected:
bool emitToReceiver (lout::signal::Receiver *receiver, int signalNo,
@@ -135,6 +136,7 @@ private:
public:
inline void connectLayout (Receiver *receiver) { connect (receiver); }
+ void emitResizeQueued (bool extremesChanged);
void emitCanvasSizeChanged (int width, int ascent, int descent);
};
@@ -252,7 +254,7 @@ private:
void queueDraw (int x, int y, int width, int height);
void queueDrawExcept (int x, int y, int width, int height,
int ex, int ey, int ewidth, int eheight);
- void queueResize ();
+ void queueResize (bool extremesChanged);
void removeWidget ();
/* For tests regarding the respective Layout and (mostly) Widget
diff --git a/dw/ui.cc b/dw/ui.cc
index 75314342..8fb34c96 100644
--- a/dw/ui.cc
+++ b/dw/ui.cc
@@ -288,14 +288,16 @@ Iterator *LabelButtonResource::iterator (Content::Type mask, bool atEnd)
// ----------------------------------------------------------------------
-void ComplexButtonResource::LayoutReceiver::canvasSizeChanged (int width,
- int ascent,
- int descent)
+void ComplexButtonResource::LayoutReceiver::resizeQueued (bool extremesChanged)
{
- /**
- * \todo Verify that this is correct.
- */
- resource->queueResize (resource->childWidget->extremesQueued ());
+ DBG_OBJ_MSGF_O ("resize", 0, resource,
+ "LayoutReceiver::<b>resizeQueued</b> (%s)",
+ extremesChanged ? "true" : "false");
+ DBG_OBJ_MSG_START_O (resource);
+
+ resource->queueResize (extremesChanged);
+
+ DBG_OBJ_MSG_END_O (resource);
}
ComplexButtonResource::ComplexButtonResource ()
diff --git a/dw/ui.hh b/dw/ui.hh
index 75d69341..cab67e17 100644
--- a/dw/ui.hh
+++ b/dw/ui.hh
@@ -378,7 +378,7 @@ private:
public:
ComplexButtonResource *resource;
- void canvasSizeChanged (int width, int ascent, int descent);
+ void resizeQueued (bool extremesChanged);
};
friend class LayoutReceiver;
diff --git a/dw/widget.cc b/dw/widget.cc
index 0ef1fc78..82677cc8 100644
--- a/dw/widget.cc
+++ b/dw/widget.cc
@@ -262,7 +262,7 @@ void Widget::actualQueueResize (int ref, bool extremesChanged)
}
if (layout)
- layout->queueResize ();
+ layout->queueResize (extremesChanged);
leaveQueueResize ();