diff --git a/Makefile.am b/Makefile.am
index c573925..d110dcd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,9 +47,13 @@ rtbuf_gtk_SOURCES = \
rtbuf_gtk_resources.c \
rtbuf_input_widget.c \
rtbuf_lib.c \
+ rtbuf_output_widget.c \
rtbuf_widget.c
include_HEADERS += \
- rtbuf_lib.h
+ rtbuf_input_widget.h \
+ rtbuf_lib.h \
+ rtbuf_output_widget.h \
+ rtbuf_widget.h
rtbuf_gtk_UI = \
rtbuf_input_widget.ui \
rtbuf_modular.ui \
diff --git a/rtbuf_gtk.c b/rtbuf_gtk.c
index 71145bd..0b7a5a5 100644
--- a/rtbuf_gtk.c
+++ b/rtbuf_gtk.c
@@ -10,6 +10,7 @@ enum dnd_targets {
N_TARGETS
};
+unsigned int g_next_id = 0;
GtkBuilder *builder = NULL;
GtkWindow *modular = NULL;
@@ -133,14 +134,19 @@ gboolean rtbuf_gtk_rtbuf_button_press (GtkWidget *widget,
}
-RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtb,
+RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtbuf,
const gint x, const gint y)
{
- RtbufWidget *widget = rtbuf_widget_new(rtb, "rtbuf");
- GtkWidget *event_box = rtbuf_widget_get_event_box(widget);
+ RtbufWidget *widget;
+ GtkWidget *event_box;
+ char label[1024];
printf("rtbuf-gtk modular layout new\n");
+ snprintf(label, sizeof(label), "%s%02d",
+ rtbuf->proc->name,
+ g_next_id++);
+ widget = rtbuf_widget_new(rtbuf, label);
gtk_layout_put(modular_layout, GTK_WIDGET(widget), x, y);
- rtbuf_widget_set_label(widget, "test");
+ event_box = rtbuf_widget_get_event_box(widget);
g_signal_connect_swapped(G_OBJECT(event_box), "button-press-event",
G_CALLBACK(rtbuf_gtk_rtbuf_button_press),
widget);
diff --git a/rtbuf_input_widget.c b/rtbuf_input_widget.c
index 93634d1..e81b76f 100644
--- a/rtbuf_input_widget.c
+++ b/rtbuf_input_widget.c
@@ -66,13 +66,13 @@ rtbuf_input_widget_class_init (RtbufInputWidgetClass *klass)
"Pointer to a s_rtbuf",
G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
rtbuf_input_widget_props[PROP_IN] =
- g_param_spec_uint("in",
- "Input",
- "rtbuf input index",
- 0, /* min */
- RTBUF_PROC_IN_MAX, /* max */
- -1, /* default */
- G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ g_param_spec_int("in",
+ "Input",
+ "rtbuf input index",
+ -1, /* min */
+ RTBUF_PROC_IN_MAX, /* max */
+ -1, /* default */
+ G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
g_object_class_install_properties(gobject_class, LAST_PROP, rtbuf_input_widget_props);
gtk_widget_class_set_template_from_resource(widget_class,
"/rtbuf/rtbuf_input_widget.ui");
@@ -110,7 +110,7 @@ rtbuf_input_widget_set_property (GObject *object, guint prop_id,
rtbuf_input_widget_update(widget);
break;
case PROP_IN:
- priv->in = g_value_get_uint(value);
+ priv->in = g_value_get_int(value);
rtbuf_input_widget_update(widget);
break;
default:
@@ -131,7 +131,7 @@ rtbuf_input_widget_get_property (GObject *object, guint prop_id,
g_value_set_pointer(value, priv->rtbuf);
break;
case PROP_IN:
- g_value_set_uint(value, priv->in);
+ g_value_set_int(value, priv->in);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
diff --git a/rtbuf_output_widget.c b/rtbuf_output_widget.c
new file mode 100644
index 0000000..e51cec2
--- /dev/null
+++ b/rtbuf_output_widget.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2020 Thomas de Grivel <thoxdg@gmail.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <gtk/gtk.h>
+#include "rtbuf_output_widget.h"
+#include "rtbuf.h"
+
+struct _RtbufOutputWidgetPrivate {
+ s_rtbuf *rtbuf;
+ int out;
+ GtkWidget *check;
+ GtkWidget *label;
+};
+
+enum {
+ PROP_0,
+ PROP_RTBUF,
+ PROP_OUT,
+ LAST_PROP
+};
+
+static GParamSpec *rtbuf_output_widget_props[LAST_PROP];
+
+static void rtbuf_output_widget_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void rtbuf_output_widget_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void rtbuf_output_widget_finalize (GObject *object);
+
+G_DEFINE_TYPE_WITH_PRIVATE (RtbufOutputWidget, rtbuf_output_widget, GTK_TYPE_BOX)
+
+static void
+rtbuf_output_widget_class_init (RtbufOutputWidgetClass *klass)
+{
+ GObjectClass *gobject_class = (GObjectClass*) klass;
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+ printf("rtbuf_output_widget class init\n");
+ gobject_class->finalize = rtbuf_output_widget_finalize;
+ gobject_class->set_property = rtbuf_output_widget_set_property;
+ gobject_class->get_property = rtbuf_output_widget_get_property;
+ rtbuf_output_widget_props[PROP_RTBUF] =
+ g_param_spec_pointer("rtbuf",
+ "Rtbuf",
+ "Pointer to a s_rtbuf",
+ G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ rtbuf_output_widget_props[PROP_OUT] =
+ g_param_spec_int("out",
+ "Output",
+ "rtbuf output index",
+ -1, /* min */
+ RTBUF_PROC_OUT_MAX, /* max */
+ -1, /* default */
+ G_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+ g_object_class_install_properties(gobject_class, LAST_PROP, rtbuf_output_widget_props);
+ gtk_widget_class_set_template_from_resource(widget_class,
+ "/rtbuf/rtbuf_output_widget.ui");
+ gtk_widget_class_bind_template_child_private(widget_class,
+ RtbufOutputWidget, check);
+ gtk_widget_class_bind_template_child_private(widget_class,
+ RtbufOutputWidget, label);
+}
+
+static void
+rtbuf_output_widget_init (RtbufOutputWidget *widget)
+{
+ printf("rtbuf_output_widget init\n");
+ gtk_widget_init_template(GTK_WIDGET(widget));
+}
+
+static void
+rtbuf_output_widget_set_property (GObject *object, guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ RtbufOutputWidget *widget = RTBUF_OUTPUT_WIDGET(object);
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ switch (prop_id) {
+ case PROP_RTBUF:
+ priv->rtbuf = g_value_get_pointer(value);
+ rtbuf_output_widget_update(widget);
+ break;
+ case PROP_OUT:
+ priv->out = g_value_get_int(value);
+ rtbuf_output_widget_update(widget);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+rtbuf_output_widget_get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ RtbufOutputWidget *widget = RTBUF_OUTPUT_WIDGET(object);
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ switch (prop_id) {
+ case PROP_RTBUF:
+ g_value_set_pointer(value, priv->rtbuf);
+ break;
+ case PROP_OUT:
+ g_value_set_int(value, priv->out);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+rtbuf_output_widget_finalize (GObject *object)
+{
+ RtbufOutputWidget *widget = RTBUF_OUTPUT_WIDGET(object);
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ g_clear_object(&priv->check);
+ g_clear_object(&priv->label);
+ G_OBJECT_CLASS(rtbuf_output_widget_parent_class)->finalize(object);
+}
+
+RtbufOutputWidget *
+rtbuf_output_widget_new (s_rtbuf *rtbuf, unsigned int out)
+{
+ return (RtbufOutputWidget*) g_object_new(RTBUF_OUTPUT_WIDGET_TYPE,
+ "rtbuf", rtbuf,
+ "out", out,
+ NULL);
+}
+
+s_rtbuf *
+rtbuf_output_widget_get_rtbuf (RtbufOutputWidget *widget)
+{
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ if (priv)
+ return priv->rtbuf;
+ return NULL;
+}
+
+unsigned int
+rtbuf_output_widget_get_out (RtbufOutputWidget *widget)
+{
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ if (priv)
+ return priv->out;
+ return 0;
+}
+
+GtkWidget *
+rtbuf_output_widget_get_check (RtbufOutputWidget *widget)
+{
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ if (priv)
+ return priv->check;
+ return NULL;
+}
+
+void
+rtbuf_output_widget_update (RtbufOutputWidget *widget)
+{
+ const RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ if (priv && priv->rtbuf && priv->out >= 0) {
+ const s_rtbuf_proc *proc = priv->rtbuf->proc;
+ const char *label;
+ assert(priv->out < proc->out_n);
+ label = proc->out[priv->out].name;
+ gtk_label_set_text(GTK_LABEL(priv->label), label);
+ }
+}
diff --git a/rtbuf_output_widget.h b/rtbuf_output_widget.h
new file mode 100644
index 0000000..76b6c1f
--- /dev/null
+++ b/rtbuf_output_widget.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2020 Thomas de Grivel <thoxdg@gmail.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef RTBUF_OUTPUT_WIDGET_H
+#define RTBUF_OUTPUT_WIDGET_H
+
+#include "rtbuf.h"
+
+#define RTBUF_OUTPUT_WIDGET_TYPE \
+ (rtbuf_output_widget_get_type())
+
+#define RTBUF_OUTPUT_WIDGET(object) \
+ (G_TYPE_CHECK_INSTANCE_CAST((object), RTBUF_OUTPUT_WIDGET_TYPE, \
+ RtbufOutputWidget))
+
+#define RTBUF_OUTPUT_WIDGET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass), RTBUF_OUTPUT_WIDGET_TYPE, \
+ RtbufOutputWidgetClass))
+
+#define IS_RTBUF_OUTPUT_WIDGET(object) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((object), RTBUF_OUTPUT_WIDGET_TYPE))
+
+#define IS_RTBUF_OUTPUT_WIDGET_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass), RTBUF_OUTPUT_WIDGET_TYPE))
+
+#define RTBUF_OUTPUT_WIDGET_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS((obj), RTBUF_OUTPUT_WIDGET_TYPE, \
+ RtbufOutputWidgetClass))
+
+typedef struct _RtbufOutputWidget RtbufOutputWidget;
+typedef struct _RtbufOutputWidgetClass RtbufOutputWidgetClass;
+typedef struct _RtbufOutputWidgetPrivate RtbufOutputWidgetPrivate;
+
+struct _RtbufOutputWidget {
+ GtkBox box;
+};
+
+struct _RtbufOutputWidgetClass {
+ GtkBoxClass parent_class;
+};
+
+GType rtbuf_output_widget_get_type (void) G_GNUC_CONST;
+RtbufOutputWidget * rtbuf_output_widget_new (s_rtbuf *rtbuf,
+ unsigned int out);
+s_rtbuf * rtbuf_output_widget_get_rtbuf (RtbufOutputWidget *widget);
+unsigned int rtbuf_output_widget_get_out (RtbufOutputWidget *widget);
+GtkWidget * rtbuf_output_widget_get_check (RtbufOutputWidget *widget);
+void rtbuf_output_widget_update (RtbufOutputWidget *widget);
+
+#endif
diff --git a/rtbuf_output_widget.ui b/rtbuf_output_widget.ui
index 6c0e8c3..fc3a250 100644
--- a/rtbuf_output_widget.ui
+++ b/rtbuf_output_widget.ui
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.1 -->
+<!-- Generated with glade 3.22.2 -->
<interface>
<requires lib="gtk+" version="3.20"/>
- <template class="RtbufOutput" parent="GtkBox">
+ <template class="RtbufOutputWidget" parent="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <object class="GtkCheckButton" id="output_check">
+ <object class="GtkCheckButton" id="check">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
@@ -23,7 +23,7 @@
</packing>
</child>
<child>
- <object class="GtkLabel" id="output_label">
+ <object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">output</property>
diff --git a/rtbuf_widget.c b/rtbuf_widget.c
index 8059684..db086cc 100644
--- a/rtbuf_widget.c
+++ b/rtbuf_widget.c
@@ -17,6 +17,7 @@
#include <assert.h>
#include <gtk/gtk.h>
#include "rtbuf_input_widget.h"
+#include "rtbuf_output_widget.h"
#include "rtbuf_widget.h"
#include "rtbuf.h"
@@ -187,20 +188,25 @@ void rtbuf_widget_set_rtbuf (RtbufWidget *widget, s_rtbuf *rtbuf)
RtbufWidgetPrivate *priv = rtbuf_widget_get_instance_private(widget);
GtkContainer *inputs;
+ GtkContainer *outputs;
s_rtbuf_proc *proc;
unsigned int i;
printf("rtbuf_widget set rtbuf\n");
priv->rtbuf = rtbuf;
proc = rtbuf->proc;
inputs = GTK_CONTAINER(priv->inputs);
+ outputs = GTK_CONTAINER(priv->outputs);
gtk_container_clear(inputs);
for (i = 0; i < proc->in_n; i++) {
RtbufInputWidget *input_widget =
rtbuf_input_widget_new(priv->rtbuf, i);
gtk_container_add(inputs, GTK_WIDGET(input_widget));
- i++;
}
+ gtk_container_clear(outputs);
for (i = 0; i < proc->out_n; i++) {
+ RtbufOutputWidget *output_widget =
+ rtbuf_output_widget_new(priv->rtbuf, i);
+ gtk_container_add(outputs, GTK_WIDGET(output_widget));
}
}