Commit f52c690ac03e8893b0c4b805aeb2d9135d6d72aa

Thomas de Grivel 2020-05-03T19:44:44

rtbuf-gtk start stop run thread

diff --git a/gtk/rtbuf_gtk.c b/gtk/rtbuf_gtk.c
index 9bdd76a..a97ded6 100644
--- a/gtk/rtbuf_gtk.c
+++ b/gtk/rtbuf_gtk.c
@@ -15,8 +15,9 @@
  */
 
 #include <assert.h>
-#include <gtk/gtk.h>
 #include <stdio.h>
+#include <pthread.h>
+#include <gtk/gtk.h>
 #include <rtbuf/rtbuf.h>
 #include <rtbuf/lib.h>
 #include <rtbuf/var.h>
@@ -30,7 +31,10 @@ unsigned int g_next_id = 0;
 
 GtkBuilder *builder = NULL;
 
+pthread_t g_rtbuf_gtk_thread = NULL;
+
 GtkWindow              *modular = NULL;
+GtkToolbar             *modular_toolbar = NULL;
 s_rtbuf_gtk_connection *modular_connections = NULL;
 GtkLayout              *modular_layout = NULL;
 
@@ -358,6 +362,90 @@ gboolean rtbuf_gtk_modular_motion (GtkWidget       *widget,
   return FALSE;
 }
 
+void * rtbuf_gtk_thread_proc (void *arg)
+{
+  (void) arg;
+  printf("rtbuf thread: start\n");
+  if (!rtbuf_start())
+    g_rtbuf_run = 1;
+  while (g_rtbuf_run) {
+    if (rtbuf_run())
+      g_rtbuf_run = 0;
+  }
+  printf("rtbuf thread: stop\n");
+  rtbuf_stop();
+  return 0;
+}
+
+int rtbuf_gtk_start ()
+{
+  if (!g_rtbuf_run && g_rtbuf_gtk_thread) {
+    if (pthread_join(g_rtbuf_gtk_thread, 0))
+      return rtbuf_err("pthread_join failed");
+    g_rtbuf_gtk_thread = 0;
+  }
+  if (!g_rtbuf_gtk_thread) {
+    if (pthread_create(&g_rtbuf_gtk_thread, 0, &rtbuf_gtk_thread_proc,
+                       0))
+      return rtbuf_err("pthread_create failed");
+  }
+  return 0;
+}
+
+int rtbuf_gtk_stop ()
+{
+  if (g_rtbuf_run)
+    g_rtbuf_run = 0;
+  if (g_rtbuf_gtk_thread) {
+    if (pthread_join(g_rtbuf_gtk_thread, 0))
+      return rtbuf_err("pthread_join failed");
+    g_rtbuf_gtk_thread = 0;
+  }
+  return 0;
+}
+
+void rtbuf_gtk_modular_start (GtkWidget *widget, gpointer data)
+{
+  (void) widget;
+  (void) data;
+  printf("rtbuf> start\n");
+  rtbuf_gtk_start();
+}
+
+void rtbuf_gtk_modular_stop (GtkWidget *widget, gpointer data)
+{
+  (void) widget;
+  (void) data;
+  printf("rtbuf> stop\n");
+  rtbuf_gtk_stop();
+}
+
+void rtbuf_gtk_modular_toolbar ()
+{
+  GtkWidget *image;
+  GtkToolItem *item;
+  modular_toolbar = GTK_TOOLBAR(gtk_builder_get_object(builder,
+                                                       "toolbar"));
+  image = gtk_image_new_from_icon_name("player_play",
+                                       GTK_ICON_SIZE_LARGE_TOOLBAR);
+  gtk_widget_show(image);
+  item = gtk_tool_button_new(image, "Start");
+  gtk_widget_show(GTK_WIDGET(item));
+  g_signal_connect(item, "clicked",
+                   G_CALLBACK(rtbuf_gtk_modular_start),
+                   NULL);
+  gtk_toolbar_insert(modular_toolbar, item, -1);
+  image = gtk_image_new_from_icon_name("player_stop",
+                                       GTK_ICON_SIZE_LARGE_TOOLBAR);
+  gtk_widget_show(image);
+  item = gtk_tool_button_new(image, "Stop");
+  gtk_widget_show(GTK_WIDGET(item));
+  g_signal_connect(item, "clicked",
+                   G_CALLBACK(rtbuf_gtk_modular_stop),
+                   NULL);
+  gtk_toolbar_insert(modular_toolbar, item, -1);
+}
+
 void rtbuf_gtk_modular ()
 {
   GObject *button;
@@ -378,6 +466,7 @@ void rtbuf_gtk_modular ()
                    G_CALLBACK(rtbuf_gtk_modular_draw), NULL);
 
   rtbuf_gtk_library_menu();
+  rtbuf_gtk_modular_toolbar();
 
   g_signal_connect(modular_layout, "motion-notify-event",
                    G_CALLBACK(rtbuf_gtk_modular_motion), NULL);
diff --git a/gtk/rtbuf_modular.ui b/gtk/rtbuf_modular.ui
index 58ccab7..c89b281 100644
--- a/gtk/rtbuf_modular.ui
+++ b/gtk/rtbuf_modular.ui
@@ -205,7 +205,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToolbar">
+          <object class="GtkToolbar" id="toolbar">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
           </object>