Commit bd929a8b2ddd4811c25dc1a90c5cf3d2ecf5c35f

Thomas de Grivel 2020-03-09T15:47:49

rtbuf gtk rtbuf menu

diff --git a/rtbuf_gtk.c b/rtbuf_gtk.c
index b1b7064..91f4640 100644
--- a/rtbuf_gtk.c
+++ b/rtbuf_gtk.c
@@ -1,3 +1,4 @@
+#include <assert.h>
 #include <gtk/gtk.h>
 #include <stdio.h>
 #include "rtbuf.h"
@@ -15,17 +16,53 @@ void rtbuf_gtk_rtbuf_rename (RtbufWidget *widget)
   printf("rtbuf-gtk rtbuf rename\n");
 }
 
+void rtbuf_gtk_rtbuf_delete (RtbufWidget *widget)
+{
+  s_rtbuf *rtbuf = rtbuf_widget_get_rtbuf(widget);
+  printf("rtbuf-gtk rtbuf delete\n");
+  gtk_container_remove(GTK_CONTAINER(modular_layout),
+                       GTK_WIDGET(widget));
+  rtbuf_delete(rtbuf);
+}
+
 void rtbuf_gtk_rtbuf_menu (RtbufWidget *widget, GdkEvent *event)
 {
-  GtkMenu *menu = GTK_MENU(gtk_menu_new());
-  GtkWidget *item;
+  static GtkMenu *menu = 0;
+  static GtkWidget *rename;
+  static GtkWidget *delete;
+  static guint signal;
   printf("rtbuf-gtk rtbuf popup\n");
-  item = gtk_menu_item_new_with_label("Rename...");
-  gtk_container_add(GTK_CONTAINER(menu), item);
-  g_signal_connect_swapped(G_OBJECT(item), "activate",
+  if (!menu) {
+    signal = g_signal_lookup("activate", GTK_TYPE_MENU_ITEM);
+    assert(signal);
+    menu = GTK_MENU(gtk_menu_new());
+    rename = gtk_menu_item_new_with_label("Rename...");
+    gtk_container_add(GTK_CONTAINER(menu), rename);
+    gtk_widget_show(rename);
+    delete = gtk_menu_item_new_with_label("Delete");
+    gtk_container_add(GTK_CONTAINER(menu), delete);
+    gtk_widget_show(delete);
+  }
+  g_signal_handlers_disconnect_matched(G_OBJECT(rename),
+                                       G_SIGNAL_MATCH_FUNC,
+                                       signal,
+                                       0,
+                                       NULL,
+                                       G_CALLBACK(rtbuf_gtk_rtbuf_rename),
+                                       NULL);
+  g_signal_connect_swapped(G_OBJECT(rename), "activate",
                            G_CALLBACK(rtbuf_gtk_rtbuf_rename),
                            widget);
-  gtk_widget_show(item);
+  g_signal_handlers_disconnect_matched(G_OBJECT(delete),
+                                       G_SIGNAL_MATCH_FUNC,
+                                       signal,
+                                       0,
+                                       NULL,
+                                       G_CALLBACK(rtbuf_gtk_rtbuf_delete),
+                                       NULL);
+  g_signal_connect_swapped(G_OBJECT(delete), "activate",
+                           G_CALLBACK(rtbuf_gtk_rtbuf_delete),
+                           widget);
   gtk_menu_popup_at_pointer(menu, event);
 }
 
diff --git a/rtbuf_widget.c b/rtbuf_widget.c
index 3a641d4..dd7567b 100644
--- a/rtbuf_widget.c
+++ b/rtbuf_widget.c
@@ -177,19 +177,28 @@ const gchar *
 rtbuf_widget_get_label (RtbufWidget *widget)
 {
   RtbufWidgetPrivate *priv;
-  g_return_val_if_fail(IS_RTBUF_WIDGET(widget), NULL);
   priv = rtbuf_widget_get_instance_private(widget);
-  if (GTK_IS_LABEL(priv->label))
+  if (priv && priv->label)
     return gtk_label_get_text(GTK_LABEL(priv->label));
-  else
-    return NULL;
+  return NULL;
 }
 
 GtkWidget *
 rtbuf_widget_get_event_box (RtbufWidget *widget)
 {
   RtbufWidgetPrivate *priv;
-  g_return_val_if_fail(IS_RTBUF_WIDGET(widget), NULL);
   priv = rtbuf_widget_get_instance_private(widget);
-  return priv->event_box;
+  if (priv)
+    return priv->event_box;
+  return NULL;
+}
+
+s_rtbuf *
+rtbuf_widget_get_rtbuf (RtbufWidget *widget)
+{
+  RtbufWidgetPrivate *priv;
+  priv = rtbuf_widget_get_instance_private(widget);
+  if (priv)
+    return priv->rtbuf;
+  return NULL;
 }
diff --git a/rtbuf_widget.h b/rtbuf_widget.h
index 8be0d04..319d859 100644
--- a/rtbuf_widget.h
+++ b/rtbuf_widget.h
@@ -43,5 +43,6 @@ RtbufWidget * rtbuf_widget_new (s_rtbuf *rtb, const gchar *label);
 void          rtbuf_widget_set_label (RtbufWidget *widget, const gchar *label);
 const gchar * rtbuf_widget_get_label (RtbufWidget *widget);
 GtkWidget *   rtbuf_widget_get_event_box (RtbufWidget *widget);
+s_rtbuf *     rtbuf_widget_get_rtbuf (RtbufWidget *widget);
 
 #endif