diff --git a/Makefile.am b/Makefile.am
index 960772b..03fdc44 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -45,6 +45,7 @@ rtbuf_gtk_LDADD = ${GTK3_LIBS} librtbuf.la
rtbuf_gtk_SOURCES = \
rtbuf_gtk.c \
rtbuf_gtk_input.c \
+ rtbuf_gtk_output.c \
rtbuf_gtk_resources.c \
rtbuf_gtk_rtbuf.c \
rtbuf_input_widget.c \
diff --git a/rtbuf_gtk.c b/rtbuf_gtk.c
index 9c8e947..6252f8f 100644
--- a/rtbuf_gtk.c
+++ b/rtbuf_gtk.c
@@ -67,6 +67,9 @@ RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtbuf,
rtbuf_widget_connect_input_checks
(widget, "button-press-event",
G_CALLBACK(rtbuf_gtk_input_check_button_press));
+ rtbuf_widget_connect_output_checks
+ (widget, "button-press-event",
+ G_CALLBACK(rtbuf_gtk_output_check_button_press));
return widget;
}
diff --git a/rtbuf_gtk.h b/rtbuf_gtk.h
index c56f79d..26a1d08 100644
--- a/rtbuf_gtk.h
+++ b/rtbuf_gtk.h
@@ -3,6 +3,7 @@
#include <gtk/gtk.h>
#include "rtbuf_input_widget.h"
+#include "rtbuf_output_widget.h"
#include "rtbuf_widget.h"
GtkLayout *modular_layout;
@@ -19,4 +20,7 @@ gboolean rtbuf_gtk_rtbuf_button_press (GtkWidget *widget,
gboolean rtbuf_gtk_input_check_button_press (RtbufInputWidget *widget,
GdkEvent *event);
+gboolean rtbuf_gtk_output_check_button_press (RtbufOutputWidget *widget,
+ GdkEvent *event);
+
#endif /* RTBUF_GTK_H */
diff --git a/rtbuf_gtk_output.c b/rtbuf_gtk_output.c
new file mode 100644
index 0000000..2d2ad22
--- /dev/null
+++ b/rtbuf_gtk_output.c
@@ -0,0 +1,79 @@
+/*
+ * 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 <stdio.h>
+#include "rtbuf.h"
+#include "rtbuf_gtk.h"
+#include "rtbuf_output_widget.h"
+
+void rtbuf_gtk_output_disconnect (RtbufOutputWidget *widget)
+{
+ (void) widget;
+ printf("rtbuf-gtk output disconnect\n");
+}
+
+void rtbuf_gtk_output_menu (RtbufOutputWidget *widget, GdkEvent *event)
+{
+ static GtkMenu *menu = 0;
+ static GtkWidget *disconnect;
+ static guint signal;
+ printf("rtbuf-gtk output menu\n");
+ if (!menu) {
+ signal = g_signal_lookup("activate", GTK_TYPE_MENU_ITEM);
+ assert(signal);
+ menu = GTK_MENU(gtk_menu_new());
+ disconnect = gtk_menu_item_new_with_label("Disconnect");
+ gtk_container_add(GTK_CONTAINER(menu), disconnect);
+ gtk_widget_show(disconnect);
+ }
+ g_signal_handlers_disconnect_matched(G_OBJECT(disconnect),
+ G_SIGNAL_MATCH_FUNC,
+ signal,
+ 0,
+ NULL,
+ G_CALLBACK(rtbuf_gtk_output_disconnect),
+ NULL);
+ g_signal_connect_swapped(G_OBJECT(disconnect), "activate",
+ G_CALLBACK(rtbuf_gtk_output_disconnect),
+ widget);
+ gtk_menu_popup_at_pointer(menu, event);
+}
+
+void rtbuf_gtk_output_drag (RtbufOutputWidget *widget,
+ GdkEvent *event)
+{
+ printf("rtbuf-gtk output drag\n");
+}
+
+gboolean rtbuf_gtk_output_check_button_press (RtbufOutputWidget *widget,
+ GdkEvent *event)
+{
+ printf("rtbuf-gtk output check button press\n");
+ if (event->type == GDK_BUTTON_PRESS) {
+ GdkEventButton *eb = (GdkEventButton*) event;
+ if (eb->button == 1) {
+ rtbuf_gtk_output_drag(widget, event);
+ return TRUE;
+ }
+ else if (eb->button == 3) {
+ rtbuf_gtk_output_menu(widget, event);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
diff --git a/rtbuf_output_widget.c b/rtbuf_output_widget.c
index e51cec2..a09eac3 100644
--- a/rtbuf_output_widget.c
+++ b/rtbuf_output_widget.c
@@ -16,6 +16,7 @@
#include <assert.h>
#include <gtk/gtk.h>
+#include "rtbuf_gtk_signal_binding.h"
#include "rtbuf_output_widget.h"
#include "rtbuf.h"
@@ -191,3 +192,14 @@ rtbuf_output_widget_update (RtbufOutputWidget *widget)
gtk_label_set_text(GTK_LABEL(priv->label), label);
}
}
+
+void rtbuf_output_widget_connect_check (GtkWidget *output,
+ gpointer data)
+{
+ RtbufOutputWidget *widget = RTBUF_OUTPUT_WIDGET(output);
+ RtbufOutputWidgetPrivate *priv =
+ rtbuf_output_widget_get_instance_private(widget);
+ s_signal_binding *sb = (s_signal_binding*) data;
+ g_signal_connect_swapped(G_OBJECT(priv->check), sb->signal,
+ sb->callback, widget);
+}
diff --git a/rtbuf_output_widget.h b/rtbuf_output_widget.h
index 76b6c1f..e54cce5 100644
--- a/rtbuf_output_widget.h
+++ b/rtbuf_output_widget.h
@@ -59,5 +59,7 @@ 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);
+void rtbuf_output_widget_connect_check (GtkWidget *output,
+ gpointer data);
#endif
diff --git a/rtbuf_widget.c b/rtbuf_widget.c
index 1a238fb..9fbe83b 100644
--- a/rtbuf_widget.c
+++ b/rtbuf_widget.c
@@ -262,5 +262,16 @@ void rtbuf_widget_connect_input_checks (RtbufWidget *widget,
gtk_container_foreach(GTK_CONTAINER(priv->inputs),
rtbuf_input_widget_connect_check,
&sb);
-
+}
+
+void rtbuf_widget_connect_output_checks (RtbufWidget *widget,
+ const char *signal,
+ GCallback callback)
+{
+ RtbufWidgetPrivate *priv =
+ rtbuf_widget_get_instance_private(widget);
+ s_signal_binding sb = { signal, callback };
+ gtk_container_foreach(GTK_CONTAINER(priv->outputs),
+ rtbuf_output_widget_connect_check,
+ &sb);
}
diff --git a/rtbuf_widget.h b/rtbuf_widget.h
index 10a3471..bd02d82 100644
--- a/rtbuf_widget.h
+++ b/rtbuf_widget.h
@@ -64,5 +64,8 @@ s_rtbuf * rtbuf_widget_get_rtbuf (RtbufWidget *widget);
void rtbuf_widget_connect_input_checks (RtbufWidget *widget,
const char *signal,
GCallback callback);
+void rtbuf_widget_connect_output_checks (RtbufWidget *widget,
+ const char *signal,
+ GCallback callback);
#endif