Commit c57c29dc1326b22de95006277b121602f239a66f

Thomas de Grivel 2020-03-18T19:58:52

rtbug-gtk output button press

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