Commit f85010e4cbf884f864e04888ff5f66f9f80abda3

Thomas de Grivel 2020-03-18T19:13:05

bind signals to rtbuf input widget checkbox

diff --git a/rtbuf_gtk.c b/rtbuf_gtk.c
index 3d6efff..8f7d58c 100644
--- a/rtbuf_gtk.c
+++ b/rtbuf_gtk.c
@@ -18,6 +18,7 @@
 #include <gtk/gtk.h>
 #include <stdio.h>
 #include "rtbuf.h"
+#include "rtbuf_input_widget.h"
 #include "rtbuf_lib.h"
 #include "rtbuf_var.h"
 #include "rtbuf_widget.h"
@@ -66,7 +67,7 @@ void rtbuf_gtk_rtbuf_menu (RtbufWidget *widget, GdkEvent *event)
   static GtkWidget *rename;
   static GtkWidget *delete;
   static guint signal;
-  printf("rtbuf-gtk rtbuf popup\n");
+  printf("rtbuf-gtk rtbuf menu\n");
   if (!menu) {
     signal = g_signal_lookup("activate", GTK_TYPE_MENU_ITEM);
     assert(signal);
@@ -135,7 +136,7 @@ gboolean rtbuf_gtk_rtbuf_button_press (GtkWidget *widget,
 {
   RtbufWidget *rtbuf_widget = RTBUF_WIDGET(widget);
   (void) data;
-  printf("rtbuf-gtk rtbuf mouse down\n");
+  printf("rtbuf-gtk rtbuf button press\n");
   if (event->type == GDK_BUTTON_PRESS) {
     GdkEventButton *eb = (GdkEventButton*) event;
     if (eb->button == 1) {
@@ -150,6 +151,52 @@ gboolean rtbuf_gtk_rtbuf_button_press (GtkWidget *widget,
   return FALSE;
 }
 
+void rtbuf_gtk_input_disconnect (RtbufInputWidget *widget)
+{
+  (void) widget;
+  printf("rtbuf-gtk input disconnect\n");
+}
+
+void rtbuf_gtk_input_menu (RtbufInputWidget *widget, GdkEvent *event)
+{
+  static GtkMenu *menu = 0;
+  static GtkWidget *disconnect;
+  static guint signal;
+  printf("rtbuf-gtk input 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_input_disconnect),
+                                       NULL);
+  g_signal_connect_swapped(G_OBJECT(disconnect), "activate",
+                           G_CALLBACK(rtbuf_gtk_input_disconnect),
+                           widget);
+  gtk_menu_popup_at_pointer(menu, event);
+}
+
+gboolean rtbuf_gtk_input_check_button_press (RtbufInputWidget *widget,
+                                             GdkEvent *event)
+{
+  printf("rtbuf-gtk input check button press\n");
+  if (event->type == GDK_BUTTON_PRESS) {
+    GdkEventButton *eb = (GdkEventButton*) event;
+    if (eb->button == 3) {
+      rtbuf_gtk_input_menu(widget, event);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
 
 RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtbuf,
                                             const gint x, const gint y)
@@ -168,6 +215,9 @@ RtbufWidget * rtbuf_gtk_modular_layout_new (s_rtbuf *rtbuf,
   g_signal_connect_swapped(G_OBJECT(event_box), "button-press-event",
                            G_CALLBACK(rtbuf_gtk_rtbuf_button_press),
                            widget);
+  rtbuf_widget_connect_input_checks
+    (widget, "button-press-event",
+     G_CALLBACK(rtbuf_gtk_input_check_button_press));
   return widget;
 }
 
diff --git a/rtbuf_gtk_signal_binding.h b/rtbuf_gtk_signal_binding.h
new file mode 100644
index 0000000..79a6104
--- /dev/null
+++ b/rtbuf_gtk_signal_binding.h
@@ -0,0 +1,27 @@
+/*
+ * 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_GTK_SIGNAL_BINDING
+#define RTBUF_GTK_SIGNAL_BINDING
+
+#include <gtk/gtk.h>
+
+typedef struct {
+  const char *signal;
+  GCallback callback;
+} s_signal_binding;
+
+#endif /* RTBUF_GTK_SIGNAL_BINDING */
diff --git a/rtbuf_input_widget.c b/rtbuf_input_widget.c
index e81b76f..87b8e51 100644
--- a/rtbuf_input_widget.c
+++ b/rtbuf_input_widget.c
@@ -16,6 +16,7 @@
 
 #include <assert.h>
 #include <gtk/gtk.h>
+#include "rtbuf_gtk_signal_binding.h"
 #include "rtbuf_input_widget.h"
 #include "rtbuf.h"
 
@@ -206,3 +207,14 @@ rtbuf_input_widget_update (RtbufInputWidget *widget)
     gtk_label_set_text(GTK_LABEL(priv->label), label);
   }
 }
+
+void rtbuf_input_widget_connect_check (GtkWidget *input,
+                                       gpointer data)
+{
+  RtbufInputWidget *widget = RTBUF_INPUT_WIDGET(input);
+  RtbufInputWidgetPrivate *priv =
+    rtbuf_input_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_input_widget.h b/rtbuf_input_widget.h
index c183b41..83cbd76 100644
--- a/rtbuf_input_widget.h
+++ b/rtbuf_input_widget.h
@@ -59,5 +59,7 @@ s_rtbuf *     rtbuf_input_widget_get_rtbuf (RtbufInputWidget *widget);
 unsigned int  rtbuf_input_widget_get_in    (RtbufInputWidget *widget);
 GtkWidget *   rtbuf_input_widget_get_check (RtbufInputWidget *widget);
 void          rtbuf_input_widget_update    (RtbufInputWidget *widget);
+void          rtbuf_input_widget_connect_check (GtkWidget *input,
+                                                gpointer data);
 
 #endif
diff --git a/rtbuf_widget.c b/rtbuf_widget.c
index db086cc..1a238fb 100644
--- a/rtbuf_widget.c
+++ b/rtbuf_widget.c
@@ -16,6 +16,7 @@
 
 #include <assert.h>
 #include <gtk/gtk.h>
+#include "rtbuf_gtk_signal_binding.h"
 #include "rtbuf_input_widget.h"
 #include "rtbuf_output_widget.h"
 #include "rtbuf_widget.h"
@@ -224,8 +225,8 @@ void rtbuf_widget_set_label (RtbufWidget *widget,
 const gchar *
 rtbuf_widget_get_label (RtbufWidget *widget)
 {
-  RtbufWidgetPrivate *priv;
-  priv = rtbuf_widget_get_instance_private(widget);
+  RtbufWidgetPrivate *priv =
+    rtbuf_widget_get_instance_private(widget);
   if (priv && priv->label)
     return gtk_label_get_text(GTK_LABEL(priv->label));
   return NULL;
@@ -234,8 +235,8 @@ rtbuf_widget_get_label (RtbufWidget *widget)
 GtkWidget *
 rtbuf_widget_get_event_box (RtbufWidget *widget)
 {
-  RtbufWidgetPrivate *priv;
-  priv = rtbuf_widget_get_instance_private(widget);
+  RtbufWidgetPrivate *priv =
+    rtbuf_widget_get_instance_private(widget);
   if (priv)
     return priv->event_box;
   return NULL;
@@ -244,9 +245,22 @@ rtbuf_widget_get_event_box (RtbufWidget *widget)
 s_rtbuf *
 rtbuf_widget_get_rtbuf (RtbufWidget *widget)
 {
-  RtbufWidgetPrivate *priv;
-  priv = rtbuf_widget_get_instance_private(widget);
+  RtbufWidgetPrivate *priv =
+    rtbuf_widget_get_instance_private(widget);
   if (priv)
     return priv->rtbuf;
   return NULL;
 }
+
+void rtbuf_widget_connect_input_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->inputs),
+                        rtbuf_input_widget_connect_check,
+                        &sb);
+                        
+}
diff --git a/rtbuf_widget.h b/rtbuf_widget.h
index bb42165..10a3471 100644
--- a/rtbuf_widget.h
+++ b/rtbuf_widget.h
@@ -61,5 +61,8 @@ void          rtbuf_widget_set_label (RtbufWidget *widget,
 const gchar * rtbuf_widget_get_label (RtbufWidget *widget);
 GtkWidget *   rtbuf_widget_get_event_box (RtbufWidget *widget);
 s_rtbuf *     rtbuf_widget_get_rtbuf (RtbufWidget *widget);
+void          rtbuf_widget_connect_input_checks (RtbufWidget *widget,
+                                                 const char *signal,
+                                                 GCallback callback);
 
 #endif