summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dgl/Image.hpp78
-rw-r--r--dgl/ImageAboutWindow.hpp4
-rw-r--r--dgl/ImageButton.hpp4
-rw-r--r--dgl/ImageKnob.hpp8
-rw-r--r--dgl/ImageSlider.hpp4
-rw-r--r--dgl/Widget.hpp250
-rw-r--r--dgl/Window.hpp4
-rw-r--r--dgl/src/ImageAboutWindow.cpp8
-rw-r--r--dgl/src/ImageButton.cpp28
-rw-r--r--dgl/src/ImageKnob.cpp46
-rw-r--r--dgl/src/ImageSlider.cpp14
-rw-r--r--dgl/src/Widget.cpp111
-rw-r--r--dgl/src/Window.cpp95
-rw-r--r--distrho/src/DistrhoDefines.h2
-rw-r--r--distrho/src/DistrhoUIInternal.hpp4
15 files changed, 487 insertions, 173 deletions
diff --git a/dgl/Image.hpp b/dgl/Image.hpp
index 1a33956e..976573d2 100644
--- a/dgl/Image.hpp
+++ b/dgl/Image.hpp
@@ -23,30 +23,108 @@ START_NAMESPACE_DGL
// -----------------------------------------------------------------------
+/**
+ Base DGL Image class.
+
+ This is an Image class that handles raw image data in pixels.
+ You can init the image data on the contructor or later on by calling loadFromMemory().
+
+ To generate raw data useful for this class see the utils/png2rgba.py script.
+ Be careful when using a PNG without alpha channel, for those the format is 'GL_BGR'
+ instead of the default 'GL_BGRA'.
+
+ Images are drawn on screen via 2D textures.
+ */
class Image
{
public:
+ /**
+ Constructor for a null Image.
+ */
Image() noexcept;
+
+ /**
+ Constructor using raw image data.
+ @note @a rawData must remain valid for the lifetime of this Image.
+ */
Image(const char* rawData, int width, int height, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept;
+
+ /**
+ Constructor using raw image data.
+ @note @a rawData must remain valid for the lifetime of this Image.
+ */
Image(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept;
+
+ /**
+ Constructor using another image data.
+ */
Image(const Image& image) noexcept;
+
+ /**
+ Destructor.
+ */
~Image();
+ /**
+ Load image data from memory.
+ @note @a rawData must remain valid for the lifetime of this Image.
+ */
void loadFromMemory(const char* rawData, int width, int height, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept;
+
+ /**
+ Load image data from memory.
+ @note @a rawData must remain valid for the lifetime of this Image.
+ */
void loadFromMemory(const char* rawData, const Size<int>& size, GLenum format = GL_BGRA, GLenum type = GL_UNSIGNED_BYTE) noexcept;
+ /**
+ Check if this image is valid.
+ */
bool isValid() const noexcept;
+ /**
+ Get width.
+ */
int getWidth() const noexcept;
+
+ /**
+ Get height.
+ */
int getHeight() const noexcept;
+
+ /**
+ Get size.
+ */
const Size<int>& getSize() const noexcept;
+ /**
+ Get the raw image data.
+ */
const char* getRawData() const noexcept;
+
+ /**
+ Get the image format.
+ */
GLenum getFormat() const noexcept;
+
+ /**
+ Get the image type.
+ */
GLenum getType() const noexcept;
+ /**
+ Draw this image at (0, 0) point.
+ */
void draw();
+
+ /**
+ Draw this image at (x, y) point.
+ */
void drawAt(int x, int y);
+
+ /**
+ Draw this image at position @a pos.
+ */
void drawAt(const Point<int>& pos);
Image& operator=(const Image& image) noexcept;
diff --git a/dgl/ImageAboutWindow.hpp b/dgl/ImageAboutWindow.hpp
index fdb332c6..cfed86db 100644
--- a/dgl/ImageAboutWindow.hpp
+++ b/dgl/ImageAboutWindow.hpp
@@ -36,8 +36,8 @@ public:
protected:
void onDisplay() override;
- bool onMouse(int button, bool press, int x, int y) override;
- bool onKeyboard(bool press, uint key) override;
+ bool onKeyboard(const KeyboardEvent&) override;
+ bool onMouse(const MouseEvent&) override;
private:
Image fImgBackground;
diff --git a/dgl/ImageButton.hpp b/dgl/ImageButton.hpp
index f4907a7e..ab59434d 100644
--- a/dgl/ImageButton.hpp
+++ b/dgl/ImageButton.hpp
@@ -44,8 +44,8 @@ public:
protected:
void onDisplay() override;
- bool onMouse(int button, bool press, int x, int y) override;
- bool onMotion(int x, int y) override;
+ bool onMouse(const MouseEvent&) override;
+ bool onMotion(const MotionEvent&) override;
private:
Image fImageNormal;
diff --git a/dgl/ImageKnob.hpp b/dgl/ImageKnob.hpp
index e45c00af..7977e5a5 100644
--- a/dgl/ImageKnob.hpp
+++ b/dgl/ImageKnob.hpp
@@ -44,6 +44,7 @@ public:
ImageKnob(Window& parent, const Image& image, Orientation orientation = Vertical, int id = 0) noexcept;
ImageKnob(Widget* widget, const Image& image, Orientation orientation = Vertical, int id = 0) noexcept;
ImageKnob(const ImageKnob& imageKnob);
+ ~ImageKnob() override;
int getId() const noexcept;
void setId(int id) noexcept;
@@ -60,10 +61,9 @@ public:
protected:
void onDisplay() override;
- bool onMouse(int button, bool press, int x, int y) override;
- bool onMotion(int x, int y) override;
- void onReshape(int width, int height) override;
- void onClose() override;
+ bool onMouse(const MouseEvent&) override;
+ bool onMotion(const MotionEvent&) override;
+ void onResize(const ResizeEvent&) override;
private:
Image fImage;
diff --git a/dgl/ImageSlider.hpp b/dgl/ImageSlider.hpp
index e98399a8..90441a66 100644
--- a/dgl/ImageSlider.hpp
+++ b/dgl/ImageSlider.hpp
@@ -59,8 +59,8 @@ public:
protected:
void onDisplay() override;
- bool onMouse(int button, bool press, int x, int y) override;
- bool onMotion(int x, int y) override;
+ bool onMouse(const MouseEvent&) override;
+ bool onMotion(const MotionEvent&) override;
private:
Image fImage;
diff --git a/dgl/Widget.hpp b/dgl/Widget.hpp
index 224653cc..aec1ea55 100644
--- a/dgl/Widget.hpp
+++ b/dgl/Widget.hpp
@@ -22,45 +22,222 @@
START_NAMESPACE_DGL
// -----------------------------------------------------------------------
+// Forward class names
class App;
class Window;
+// -----------------------------------------------------------------------
+
+/**
+ Base DGL Widget class.
+
+ This is the base Widget class, from which all widgets are built.
+
+ All widgets have a parent Window where they'll be drawn.
+ This parent is never changed during the widget lifetime.
+
+ Widgets receive events in relative coordinates.
+ (0, 0) means its top-left position.
+
+ Windows paint widgets in the order they are constructed.
+ Early widgets are drawn first, at the bottom, then newer ones on top.
+ Events are sent in the inverse order so that the top-most widget gets
+ a chance to catch the event and stop its propagation.
+
+ All widget event callbacks do nothing by default.
+ */
class Widget
{
public:
+ /**
+ Base event data.
+ @param mod The currently active modifiers.
+ @param time The timestamp (if any) of the currently-processing event.
+ */
+ struct BaseEvent {
+ Modifier mod;
+ uint32_t time;
+ };
+
+ /**
+ Keyboard event.
+ @param press True if the key was pressed, false if released.
+ @param key Unicode point of the key pressed.
+ @see onKeyboard
+ */
+ struct KeyboardEvent : BaseEvent {
+ bool press;
+ uint key;
+ };
+
+ /**
+ Special keyboard event.
+ @param press True if the key was pressed, false if released.
+ @param key The key pressed.
+ @see onSpecial
+ */
+ struct SpecialEvent : BaseEvent {
+ bool press;
+ Key key;
+ };
+
+ /**
+ Mouse event.
+ @param button The button number (1 = left, 2 = middle, 3 = right).
+ @param press True if the key was pressed, false if released.
+ @param pos The widget-relative coordinates of the pointer.
+ @see onMouse
+ */
+ struct MouseEvent : BaseEvent {
+ int button;
+ bool press;
+ Point<int> pos;
+ };
+
+ /**
+ Mouse motion event.
+ @param x The widget-relative coordinates of the pointer.
+ @see onMotion
+ */
+ struct MotionEvent : BaseEvent {
+ Point<int> pos;
+ };
+
+ /**
+ Mouse scroll event.
+ @param pos The scroll distance.
+ @param _ TODO
+ @see onScroll
+ */
+ struct ScrollEvent : BaseEvent {
+ Point<int> pos;
+ Point<float> _;
+ };
+
+ /**
+ Resize event.
+ @param size The new widget size
+ @param oldSize The previous size, may be null
+ @see onResize
+ */
+ struct ResizeEvent {
+ Size<int> size;
+ Size<int> oldSize;
+ };
+
+ /**
+ Constructor.
+ */
explicit Widget(Window& parent);
+
+ /**
+ Destructor.
+ */
virtual ~Widget();
+ /**
+ Check if this widget is visible within its parent window.
+ Invisible widgets do not receive events except resize.
+ */
bool isVisible() const noexcept;
+
+ /**
+ Set widget visible (or not) according to @a yesNo.
+ */
void setVisible(bool yesNo);
+ /**
+ Show widget.
+ This is the same as calling setVisible(true).
+ */
void show();
- void hide();
- int getX() const noexcept;
- int getY() const noexcept;
- const Point<int>& getPos() const noexcept;
-
- void setX(int x) noexcept;
- void setY(int y) noexcept;
- void setPos(int x, int y) noexcept;
- void setPos(const Point<int>& pos) noexcept;
+ /**
+ Hide widget.
+ This is the same as calling setVisible(false).
+ */
+ void hide();
+ /**
+ Get width.
+ */
int getWidth() const noexcept;
+
+ /**
+ Get height.
+ */
int getHeight() const noexcept;
+
+ /**
+ Get size.
+ */
const Size<int>& getSize() const noexcept;
- // virtual needed by cairo
+ /**
+ Set width.
+ */
virtual void setWidth(int width) noexcept;
+
+ /**
+ Set height.
+ */
virtual void setHeight(int height) noexcept;
+
+ /**
+ Set size using @a width and @a height values.
+ */
virtual void setSize(int width, int height) noexcept;
+
+ /**
+ Set size.
+ */
virtual void setSize(const Size<int>& size) noexcept;
- uint getEventTimestamp() const noexcept;
- int getModifiers() const noexcept;
+ /**
+ Get absolute X.
+ */
+ int getAbsoluteX() const noexcept;
+
+ /**
+ Get absolute Y.
+ */
+ int getAbsoluteY() const noexcept;
+
+ /**
+ Get absolute position.
+ */
+ const Point<int>& getAbsolutePos() const noexcept;
+
+ /**
+ Set absolute X.
+ */
+ void setAbsoluteX(int x) noexcept;
+
+ /**
+ Set absolute Y.
+ */
+ void setAbsoluteY(int y) noexcept;
+
+ /**
+ Set absolute position using @a x and @a y values.
+ */
+ void setAbsolutePos(int x, int y) noexcept;
+
+ /**
+ Set absolute position.
+ */
+ void setAbsolutePos(const Point<int>& pos) noexcept;
+
+ /**
+ Get this widget's window application.
+ Same as calling getParentWindow().getApp().
+ */
+ App& getParentApp() const noexcept;
- App& getParentApp() const noexcept;
+ /**
+ Get parent window, as passed in the constructor.
+ */
Window& getParentWindow() const noexcept;
/**
@@ -73,16 +250,51 @@ public:
*/
bool contains(const Point<int>& pos) const noexcept;
+ /**
+ Tell this widget's window to repaint itself.
+ */
void repaint() noexcept;
protected:
+ /**
+ A function called to draw the view contents with OpenGL.
+ */
virtual void onDisplay() = 0;
- virtual bool onKeyboard(bool press, uint key);
- virtual bool onMouse(int button, bool press, int x, int y);
- virtual bool onMotion(int x, int y);
- virtual bool onScroll(int x, int y, float dx, float dy);
- virtual bool onSpecial(bool press, Key key);
- virtual void onReshape(int width, int height);
+
+ /**
+ A function called when a key is pressed or released.
+ @return True to stop event propagation, false otherwise.
+ */
+ virtual bool onKeyboard(const KeyboardEvent&);
+
+ /**
+ A function called when a special key is pressed or released.
+ @return True to stop event propagation, false otherwise.
+ */
+ virtual bool onSpecial(const SpecialEvent&);
+
+ /**
+ A function called when a mouse button is pressed or released.
+ @return True to stop event propagation, false otherwise.
+ */
+ virtual bool onMouse(const MouseEvent&);
+
+ /**
+ A function called when the pointer moves.
+ @return True to stop event propagation, false otherwise.
+ */
+ virtual bool onMotion(const MotionEvent&);
+
+ /**
+ A function called on scrolling (e.g. mouse wheel or track pad).
+ @return True to stop event propagation, false otherwise.
+ */
+ virtual bool onScroll(const ScrollEvent&);
+
+ /**
+ A function called when the widget is resized.
+ */
+ virtual void onResize(const ResizeEvent&);
private:
Window& fParent;
diff --git a/dgl/Window.hpp b/dgl/Window.hpp
index f23482a4..f52c1416 100644
--- a/dgl/Window.hpp
+++ b/dgl/Window.hpp
@@ -59,8 +59,6 @@ public:
void setTransientWinId(intptr_t winId);
App& getApp() const noexcept;
- uint getEventTimestamp() const noexcept;
- int getModifiers() const noexcept;
intptr_t getWindowId() const noexcept;
void addIdleCallback(IdleCallback* const callback);
@@ -69,8 +67,8 @@ public:
protected:
virtual void onDisplayBefore();
virtual void onDisplayAfter();
- virtual void onClose();
virtual void onReshape(int width, int height);
+ virtual void onClose();
private:
struct PrivateData;
diff --git a/dgl/src/ImageAboutWindow.cpp b/dgl/src/ImageAboutWindow.cpp
index 7065fa28..66b67a76 100644
--- a/dgl/src/ImageAboutWindow.cpp
+++ b/dgl/src/ImageAboutWindow.cpp
@@ -54,9 +54,9 @@ void ImageAboutWindow::onDisplay()
fImgBackground.draw();
}
-bool ImageAboutWindow::onMouse(int, bool press, int, int)
+bool ImageAboutWindow::onKeyboard(const KeyboardEvent& ev)
{
- if (press)
+ if (ev.press && ev.key == CHAR_ESCAPE)
{
Window::close();
return true;
@@ -65,9 +65,9 @@ bool ImageAboutWindow::onMouse(int, bool press, int, int)
return false;
}
-bool ImageAboutWindow::onKeyboard(bool press, uint key)
+bool ImageAboutWindow::onMouse(const MouseEvent& ev)
{
- if (press && key == CHAR_ESCAPE)
+ if (ev.press)
{
Window::close();
return true;
diff --git a/dgl/src/ImageButton.cpp b/dgl/src/ImageButton.cpp
index d6c4905e..29f27bd4 100644
--- a/dgl/src/ImageButton.cpp
+++ b/dgl/src/ImageButton.cpp
@@ -91,12 +91,12 @@ void ImageButton::setCallback(Callback* callback) noexcept
void ImageButton::onDisplay()
{
- fCurImage->drawAt(getPos());
+ fCurImage->draw();
}
-bool ImageButton::onMouse(int button, bool press, int x, int y)
+bool ImageButton::onMouse(const MouseEvent& ev)
{
- if (fCurButton != -1 && ! press)
+ if (fCurButton != -1 && ! ev.press)
{
if (fCurImage != &fImageNormal)
{
@@ -104,7 +104,7 @@ bool ImageButton::onMouse(int button, bool press, int x, int y)
repaint();
}
- if (! contains(x, y))
+ if (! contains(ev.pos))
{
fCurButton = -1;
return false;
@@ -113,18 +113,20 @@ bool ImageButton::onMouse(int button, bool press, int x, int y)
if (fCallback != nullptr)
fCallback->imageButtonClicked(this, fCurButton);
- //if (contains(x, y))
- //{
- // fCurImage = &fImageHover;
- // repaint();
- //}
+#if 0
+ if (contains(ev.pos))
+ {
+ fCurImage = &fImageHover;
+ repaint();
+ }
+#endif
fCurButton = -1;
return true;
}
- if (press && contains(x, y))
+ if (ev.press && contains(ev.pos))
{
if (fCurImage != &fImageDown)
{
@@ -132,19 +134,19 @@ bool ImageButton::onMouse(int button, bool press, int x, int y)
repaint();
}
- fCurButton = button;
+ fCurButton = ev.button;
return true;
}
return false;
}
-bool ImageButton::onMotion(int x, int y)
+bool ImageButton::onMotion(const MotionEvent& ev)
{
if (fCurButton != -1)
return true;
- if (contains(x, y))
+ if (contains(ev.pos))
{
if (fCurImage != &fImageHover)
{
diff --git a/dgl/src/ImageKnob.cpp b/dgl/src/ImageKnob.cpp
index cd230dc5..07ed3e94 100644
--- a/dgl/src/ImageKnob.cpp
+++ b/dgl/src/ImageKnob.cpp
@@ -101,6 +101,12 @@ ImageKnob::ImageKnob(const ImageKnob& imageKnob)
}
}
+ImageKnob::~ImageKnob()
+{
+ // delete old texture
+ setRotationAngle(0);
+}
+
int ImageKnob::getId() const noexcept
{
return fId;
@@ -274,19 +280,19 @@ void ImageKnob::onDisplay()
}
}
-bool ImageKnob::onMouse(int button, bool press, int x, int y)
+bool ImageKnob::onMouse(const MouseEvent& ev)
{
- if (button != 1)
+ if (ev.button != 1)
return false;
- if (press)
+ if (ev.press)
{
- if (! contains(x, y))
+ if (! contains(ev.pos))
return false;
fDragging = true;
- fLastX = x;
- fLastY = y;
+ fLastX = ev.pos.getX();
+ fLastY = ev.pos.getY();
if (fCallback != nullptr)
fCallback->imageKnobDragStarted(this);
@@ -305,7 +311,7 @@ bool ImageKnob::onMouse(int button, bool press, int x, int y)
return false;
}
-bool ImageKnob::onMotion(int x, int y)
+bool ImageKnob::onMotion(const MotionEvent& ev)
{
if (! fDragging)
return false;
@@ -315,18 +321,18 @@ bool ImageKnob::onMotion(int x, int y)
if (fOrientation == ImageKnob::Horizontal)
{
- if (int movX = x - fLastX)
+ if (int movX = ev.pos.getX() - fLastX)
{
- d = (getModifiers() & MODIFIER_SHIFT) ? 2000.0f : 200.0f;
+ d = (ev.mod & MODIFIER_SHIFT) ? 2000.0f : 200.0f;
value = fValueTmp + (float(fMaximum - fMinimum) / d * float(movX));
doVal = true;
}
}
else if (fOrientation == ImageKnob::Vertical)
{
- if (int movY = fLastY - y)
+ if (int movY = fLastY - ev.pos.getY())
{
- d = (getModifiers() & MODIFIER_SHIFT) ? 2000.0f : 200.0f;
+ d = (ev.mod & MODIFIER_SHIFT) ? 2000.0f : 200.0f;
value = fValueTmp + (float(fMaximum - fMinimum) / d * float(movY));
doVal = true;
}
@@ -354,26 +360,12 @@ bool ImageKnob::onMotion(int x, int y)
setValue(value, true);
- fLastX = x;
- fLastY = y;
+ fLastX = ev.pos.getX();
+ fLastY = ev.pos.getY();
return true;
}
-void ImageKnob::onReshape(int width, int height)
-{
-// if (fRotationAngle != 0)
-// glEnable(GL_TEXTURE_2D);
-
- Widget::onReshape(width, height);
-}
-
-void ImageKnob::onClose()
-{
- // delete old texture
- setRotationAngle(0);
-}
-
// -----------------------------------------------------------------------
END_NAMESPACE_DGL
diff --git a/dgl/src/ImageSlider.cpp b/dgl/src/ImageSlider.cpp
index 76eaaf61..a348c333 100644
--- a/dgl/src/ImageSlider.cpp
+++ b/dgl/src/ImageSlider.cpp
@@ -222,17 +222,19 @@ void ImageSlider::onDisplay()
fImage.drawAt(x, y);
}
-bool ImageSlider::onMouse(int button, bool press, int x, int y)
+bool ImageSlider::onMouse(const MouseEvent& ev)
{
- if (button != 1)
+ if (ev.button != 1)
return false;
- if (press)
+ if (ev.press)
{
- if (! fSliderArea.contains(x, y))
+ if (! fSliderArea.contains(ev.pos))
return false;
float vper;
+ const int x = ev.pos.getX();
+ const int y = ev.pos.getY();
if (fStartPos.getY() == fEndPos.getY())
{
@@ -292,12 +294,14 @@ bool ImageSlider::onMouse(int button, bool press, int x, int y)
return false;
}
-bool ImageSlider::onMotion(int x, int y)
+bool ImageSlider::onMotion(const MotionEvent& ev)
{
if (! fDragging)
return false;
const bool horizontal = fStartPos.getY() == fEndPos.getY();
+ const int x = ev.pos.getX();
+ const int y = ev.pos.getY();
if ((horizontal && fSliderArea.containsX(x)) || (fSliderArea.containsY(y) && ! horizontal))
{
diff --git a/dgl/src/Widget.cpp b/dgl/src/Widget.cpp
index 6741db70..960a1986 100644
--- a/dgl/src/Widget.cpp
+++ b/dgl/src/Widget.cpp
@@ -58,111 +58,116 @@ void Widget::hide()
setVisible(false);
}
-int Widget::getX() const noexcept
+int Widget::getWidth() const noexcept
{
- return fArea.getX();
+ return fArea.getWidth();
}
-int Widget::getY() const noexcept
+int Widget::getHeight() const noexcept
{
- return fArea.getY();
+ return fArea.getHeight();
}
-const Point<int>& Widget::getPos() const noexcept
+const Size<int>& Widget::getSize() const noexcept
{
- return fArea.getPos();
+ return fArea.getSize();
}
-void Widget::setX(int x) noexcept
+void Widget::setWidth(int width) noexcept
{
- if (fArea.getX() == x)
+ if (fArea.getWidth() == width)
return;
- fArea.setX(x);
+ ResizeEvent ev;
+ ev.oldSize = fArea.getSize();
+ ev.size = Size<int>(width, fArea.getHeight());
+
+ fArea.setWidth(width);
+ onResize(ev);
+
fParent.repaint();
}
-void Widget::setY(int y) noexcept
+void Widget::setHeight(int height) noexcept
{
- if (fArea.getY() == y)
+ if (fArea.getHeight() == height)
return;
- fArea.setY(y);
+ ResizeEvent ev;
+ ev.oldSize = fArea.getSize();
+ ev.size = Size<int>(fArea.getWidth(), height);
+
+ fArea.setHeight(height);
+ onResize(ev);
+
fParent.repaint();
}
-void Widget::setPos(int x, int y) noexcept
+void Widget::setSize(int width, int height) noexcept
{
- setPos(Point<int>(x, y));
+ setSize(Size<int>(width, height));
}
-void Widget::setPos(const Point<int>& pos) noexcept
+void Widget::setSize(const Size<int>& size) noexcept
{
- if (fArea.getPos() == pos)
+ if (fArea.getSize() == size)
return;
- fArea.setPos(pos);
+ ResizeEvent ev;
+ ev.oldSize = fArea.getSize();
+ ev.size = size;
+
+ fArea.setSize(size);
+ onResize(ev);
+
fParent.repaint();
}
-int Widget::getWidth() const noexcept
+int Widget::getAbsoluteX() const noexcept
{
- return fArea.getWidth();
+ return fArea.getX();
}
-int Widget::getHeight() const noexcept
+int Widget::getAbsoluteY() const noexcept
{
- return fArea.getHeight();
+ return fArea.getY();
}
-const Size<int>& Widget::getSize() const noexcept
+const Point<int>& Widget::getAbsolutePos() const noexcept
{
- return fArea.getSize();
+ return fArea.getPos();
}
-void Widget::setWidth(int width) noexcept
+void Widget::setAbsoluteX(int x) noexcept
{
- if (fArea.getWidth() == width)
+ if (fArea.getX() == x)
return;
- fArea.setWidth(width);
+ fArea.setX(x);
fParent.repaint();
- onReshape(width, fArea.getHeight());
}
-void Widget::setHeight(int height) noexcept
+void Widget::setAbsoluteY(int y) noexcept
{
- if (fArea.getHeight() == height)
+ if (fArea.getY() == y)
return;
- fArea.setHeight(height);
+ fArea.setY(y);
fParent.repaint();
- onReshape(fArea.getWidth(), height);
}
-void Widget::setSize(int width, int height) noexcept
+void Widget::setAbsolutePos(int x, int y) noexcept
{
- setSize(Size<int>(width, height));
+ setAbsolutePos(Point<int>(x, y));
}
-void Widget::setSize(const Size<int>& size) noexcept
+void Widget::setAbsolutePos(const Point<int>& pos) noexcept
{
- if (fArea.getSize() == size)
+ if (fArea.getPos() == pos)
return;
- fArea.setSize(size);
+ fArea.setPos(pos);
fParent.repaint();
- onReshape(fArea.getWidth(), fArea.getHeight());
-}
-
-uint Widget::getEventTimestamp() const noexcept
-{
- return fParent.getEventTimestamp();
-}
-
-int Widget::getModifiers() const noexcept
-{
- return fParent.getModifiers();
}
App& Widget::getParentApp() const noexcept
@@ -190,32 +195,32 @@ void Widget::repaint() noexcept
fParent.repaint();
}
-bool Widget::onKeyboard(bool, uint)
+bool Widget::onKeyboard(const KeyboardEvent&)
{
return false;
}
-bool Widget::onMouse(int, bool, int, int)
+bool Widget::onSpecial(const SpecialEvent&)
{
return false;
}
-bool Widget::onMotion(int, int)
+bool Widget::onMouse(const MouseEvent&)
{
return false;
}
-bool Widget::onScroll(int, int, float, float)
+bool Widget::onMotion(const MotionEvent&)
{
return false;
}
-bool Widget::onSpecial(bool, Key)
+bool Widget::onScroll(const ScrollEvent&)
{
return false;
}
-void Widget::onReshape(int, int)
+void Widget::onResize(const ResizeEvent&)
{
}
diff --git a/dgl/src/Window.cpp b/dgl/src/Window.cpp
index 2fccc29e..1116dcd2 100644
--- a/dgl/src/Window.cpp
+++ b/dgl/src/Window.cpp
@@ -575,7 +575,7 @@ struct Window::PrivateData {
if (widget->isVisible())
{
- glViewport(widget->getX(), -widget->getY(), fView->width, fView->height);
+ glViewport(widget->getAbsoluteX(), -widget->getAbsoluteY(), fView->width, fView->height);
widget->onDisplay();
}
}
@@ -590,75 +590,108 @@ struct Window::PrivateData {
if (fModal.childFocus != nullptr)
return fModal.childFocus->focus();
+ Widget::KeyboardEvent ev;
+ ev.press = press;
+ ev.key = key;
+ ev.mod = static_cast<Modifier>(puglGetModifiers(fView));
+ ev.time = puglGetEventTimestamp(fView);
+
FOR_EACH_WIDGET_INV(rit)
{
Widget* const widget(*rit);
- if (widget->isVisible() && widget->onKeyboard(press, key))
+ if (widget->isVisible() && widget->onKeyboard(ev))
break;
}
}
- void onMouse(const int button, const bool press, const int x, const int y)
+ void onSpecial(const bool press, const Key key)
{
- DBGp("PUGL: onMouse : %i %i %i %i\n", button, press, x, y);
+ DBGp("PUGL: onSpecial : %i %i\n", press, key);
if (fModal.childFocus != nullptr)
return fModal.childFocus->focus();
+ Widget::SpecialEvent ev;
+ ev.press = press;
+ ev.key = key;
+ ev.mod = static_cast<Modifier>(puglGetModifiers(fView));
+ ev.time = puglGetEventTimestamp(fView);
+
FOR_EACH_WIDGET_INV(rit)
{
Widget* const widget(*rit);
- if (widget->isVisible() && widget->onMouse(button, press, x-widget->getX(), y-widget->getY()))
+ if (widget->isVisible() && widget->onSpecial(ev))
break;
}
}
- void onMotion(const int x, const int y)
+ void onMouse(const int button, const bool press, const int x, const int y)
{
- DBGp("PUGL: onMotion : %i %i\n", x, y);
+ DBGp("PUGL: onMouse : %i %i %i %i\n", button, press, x, y);
if (fModal.childFocus != nullptr)
- return;
+ return fModal.childFocus->focus();
+
+ Widget::MouseEvent ev;
+ ev.button = button;
+ ev.press = press;
+ ev.mod = static_cast<Modifier>(puglGetModifiers(fView));
+ ev.time = puglGetEventTimestamp(fView);
FOR_EACH_WIDGET_INV(rit)
{
Widget* const widget(*rit);
- if (widget->isVisible() && widget->onMotion(x-widget->getX(), y-widget->getY()))
+ ev.pos = Point<int>(x-widget->getAbsoluteX(), y-widget->getAbsoluteY());
+
+ if (widget->isVisible() && widget->onMouse(ev))
break;
}
}
- void onScroll(const int x, const int y, const float dx, const float dy)
+ void onMotion(const int x, const int y)
{
- DBGp("PUGL: onScroll : %i %i %f %f\n", x, y, dx, dy);
+ DBGp("PUGL: onMotion : %i %i\n", x, y);
if (fModal.childFocus != nullptr)
return;
+ Widget::MotionEvent ev;
+ ev.mod = static_cast<Modifier>(puglGetModifiers(fView));
+ ev.time = puglGetEventTimestamp(fView);
+
FOR_EACH_WIDGET_INV(rit)
{
Widget* const widget(*rit);
- if (widget->isVisible() && widget->onScroll(x-widget->getX(), y-widget->getY(), dx, dy))
+ ev.pos = Point<int>(x-widget->getAbsoluteX(), y-widget->getAbsoluteY());
+
+ if (widget->isVisible() && widget->onMotion(ev))
break;
}
}
- void onSpecial(const bool press, const Key key)
+ void onScroll(const int x, const int y, const float dx, const float dy)
{
- DBGp("PUGL: onSpecial : %i %i\n", press, key);
+ DBGp("PUGL: onScroll : %i %i %f %f\n", x, y, dx, dy);
if (fModal.childFocus != nullptr)
- return fModal.childFocus->focus();
+ return;
+
+ Widget::ScrollEvent ev;
+ ev._ = Point<float>(dx, dy);
+ ev.mod = static_cast<Modifier>(puglGetModifiers(fView));
+ ev.time = puglGetEventTimestamp(fView);
FOR_EACH_WIDGET_INV(rit)
{
Widget* const widget(*rit);
- if (widget->isVisible() && widget->onSpecial(press, key))
+ ev.pos = Point<int>(x-widget->getAbsoluteX(), y-widget->getAbsoluteY());
+
+ if (widget->isVisible() && widget->onScroll(ev))
break;
}
}
@@ -728,7 +761,7 @@ struct Window::PrivateData {
bool fNeedsIdle;
id xWindow;
#else
- char _dummy;
+ char _dummy;
#endif
// -------------------------------------------------------------------
@@ -746,6 +779,11 @@ struct Window::PrivateData {
handlePtr->onKeyboard(press, key);
}
+ static void onSpecialCallback(PuglView* view, bool press, PuglKey key)
+ {
+ handlePtr->onSpecial(press, static_cast<Key>(key));
+ }
+
static void onMouseCallback(PuglView* view, int button, bool press, int x, int y)
{
handlePtr->onMouse(button, press, x, y);
@@ -761,11 +799,6 @@ struct Window::PrivateData {
handlePtr->onScroll(x, y, dx, dy);
}
- static void onSpecialCallback(PuglView* view, bool press, PuglKey key)
- {
- handlePtr->onSpecial(press, static_cast<Key>(key));
- }
-
static void onReshapeCallback(PuglView* view, int width, int height)
{
handlePtr->onReshape(width, height);
@@ -888,16 +921,6 @@ App& Window::getApp() const noexcept
return pData->fApp;
}
-int Window::getModifiers() const noexcept
-{
- return puglGetModifiers(pData->fView);
-}
-
-uint Window::getEventTimestamp() const noexcept
-{
- return puglGetEventTimestamp(pData->fView);
-}
-
intptr_t Window::getWindowId() const noexcept
{
return puglGetNativeWindow(pData->fView);
@@ -946,10 +969,6 @@ void Window::onDisplayAfter()
{
}
-void Window::onClose()
-{
-}
-
void Window::onReshape(int width, int height)
{
glEnable(GL_BLEND);
@@ -962,6 +981,10 @@ void Window::onReshape(int width, int height)
glLoadIdentity();
}
+void Window::onClose()
+{
+}
+
// -----------------------------------------------------------------------
END_NAMESPACE_DGL
diff --git a/distrho/src/DistrhoDefines.h b/distrho/src/DistrhoDefines.h
index e9cea2cc..461dbc3b 100644
--- a/distrho/src/DistrhoDefines.h
+++ b/distrho/src/DistrhoDefines.h
@@ -51,7 +51,7 @@
# define PROPER_CPP11_SUPPORT
#elif __cplusplus >= 201103L || (defined(__GNUC__) && defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405) || __has_extension(cxx_noexcept)
# define PROPER_CPP11_SUPPORT
-# if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) || ! __has_extension(cxx_override_control)
+# if (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) < 407) && ! __has_extension(cxx_override_control)
# define override // gcc4.7+ only
# define final // gcc4.7+ only
# endif
diff --git a/distrho/src/DistrhoUIInternal.hpp b/distrho/src/DistrhoUIInternal.hpp
index b012b188..e6085e03 100644
--- a/distrho/src/DistrhoUIInternal.hpp
+++ b/distrho/src/DistrhoUIInternal.hpp
@@ -280,11 +280,11 @@ public:
{
DISTRHO_SAFE_ASSERT_RETURN(fUi != nullptr, false);
+ glApp.idle();
+
if (glWindow.isReady())
fUi->d_uiIdle();
- glApp.idle();
-
return ! glApp.isQuiting();
}