summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Canvas.cpp8
-rw-r--r--src/canvas-base.c20
2 files changed, 27 insertions, 1 deletions
diff --git a/src/Canvas.cpp b/src/Canvas.cpp
index c70aaf3..ca28025 100644
--- a/src/Canvas.cpp
+++ b/src/Canvas.cpp
@@ -1408,7 +1408,13 @@ GanvCanvasImpl::port_event(GdkEvent* event, GanvPort* port)
case GDK_BUTTON_PRESS:
if (event->button.button == 1) {
GanvModule* const module = ganv_port_get_module(port);
- if (module && port->impl->is_input && port->impl->control) {
+ double port_x = event->button.x;
+ double port_y = event->button.y;
+ ganv_item_w2i(GANV_ITEM(port), &port_x, &port_y);
+
+ if (module && port->impl->control &&
+ (port->impl->is_input ||
+ port_x < ganv_box_get_width(GANV_BOX(port)) / 2.0)) {
if (port->impl->control->is_toggle) {
if (port->impl->control->value >= 0.5) {
ganv_port_set_control_value_internal(port, 0.0);
diff --git a/src/canvas-base.c b/src/canvas-base.c
index afd81b6..8d8b8d1 100644
--- a/src/canvas-base.c
+++ b/src/canvas-base.c
@@ -599,6 +599,26 @@ ganv_item_i2w_pair(GanvItem* item, double* x1, double* y1, double* x2, double* y
*y2 += off_y;
}
+/**
+ * ganv_item_w2i:
+ * @item: A canvas item.
+ * @x: X coordinate to convert (input/output value).
+ * @y: Y coordinate to convert (input/output value).
+ *
+ * Converts a coordinate pair from world coordinates to item-relative
+ * coordinates.
+ **/
+void
+ganv_item_w2i(GanvItem* item, double* x, double* y)
+{
+ double off_x;
+ double off_y;
+ ganv_item_i2w_offset(item, &off_x, &off_y);
+
+ *x -= off_x;
+ *y -= off_y;
+}
+
/* Returns whether the item is an inferior of or is equal to the parent. */
static gboolean
is_descendant(GanvItem* item, GanvItem* parent)