Commit 279f5f4855296b9a43be4e250647c0202f193d5e

Thomas de Grivel 2020-05-26T15:15:55

restore buffer position if saved

diff --git a/cli/include/rtbuf/cli.h b/cli/include/rtbuf/cli.h
index 9680f58..32df681 100644
--- a/cli/include/rtbuf/cli.h
+++ b/cli/include/rtbuf/cli.h
@@ -19,6 +19,9 @@
 
 #include <pthread.h>
 
+typedef void (*f_rtbuf_position) (s_rtbuf *rtb, short x, short y);
+
+extern f_rtbuf_position g_rtbuf_position_cb;
 extern pthread_t g_rtbuf_cli_run_thread;
 
 int rtbuf_cli_exit (int argc, const char *argv[]);
diff --git a/cli/rtbuf_cli.c b/cli/rtbuf_cli.c
index 2e7774b..2ea9045 100644
--- a/cli/rtbuf_cli.c
+++ b/cli/rtbuf_cli.c
@@ -25,9 +25,11 @@
 #include <rtbuf/rtbuf.h>
 #include <rtbuf/lib.h>
 #include <rtbuf/var.h>
+#include <rtbuf/cli.h>
 
-s_cli     g_cli;
-pthread_t g_rtbuf_cli_run_thread = 0;
+s_cli            g_cli;
+pthread_t        g_rtbuf_cli_run_thread = 0;
+f_rtbuf_position g_rtbuf_position_cb = 0;
 
 int rtbuf_cli_libs (int argc, const char *argv[])
 {
@@ -105,12 +107,19 @@ int rtbuf_cli_new (int argc, const char *argv[])
 {
   int rl;
   int rtb;
-  if (argc != 1)
-    return rtbuf_err("usage: new LIBRARY");
+  short x;
+  short y;
+  if (argc != 1 && argc != 3)
+    return rtbuf_err("usage: new LIBRARY [X Y]");
   if ((rl = rtbuf_lib_find(argv[1])) < 0)
     return rtbuf_err("library not found");
   if ((rtb = rtbuf_new(g_rtbuf_lib[rl].proc)) < 0)
     return rtbuf_err("buffer not created");
+  if (argc == 3 &&
+      g_rtbuf_position_cb &&
+      sscanf(argv[2], "%hd", &x) == 1 &&
+      sscanf(argv[3], "%hd", &y) == 1)
+    g_rtbuf_position_cb(&g_rtbuf[rtb], x, y);
   rtbuf_print(rtb);
   printf("\n");
   return 0;
@@ -120,19 +129,26 @@ int rtbuf_cli_new (int argc, const char *argv[])
 int rtbuf_cli_let (int argc, const char *argv[])
 {
   s_rtbuf_var *v;
+  short x;
+  short y;
   if (argc < 4 || argv[2][0] != '=' || argv[2][1])
     return rtbuf_err("usage: let VAR = TYPE ARG [...]");
   if (strncmp("new", argv[3], 4) == 0) {
     int rl;
     int rtb;
-    if (argc != 4)
-      return rtbuf_err("usage: let VAR = new LIBRARY");
+    if (argc != 4 && argc != 6)
+      return rtbuf_err("usage: let VAR = new LIBRARY [X Y]");
     if ((rl = rtbuf_lib_find(argv[4])) < 0)
       return rtbuf_err("library not found");
     if ((rtb = rtbuf_new(g_rtbuf_lib[rl].proc)) < 0)
       return rtbuf_err("buffer not created");
     v = rtbuf_var_rtbuf_set(argv[1], rtb);
     assert(v);
+    if (argc == 6 &&
+        g_rtbuf_position_cb &&
+        sscanf(argv[5], "%hd", &x) == 1 &&
+        sscanf(argv[6], "%hd", &y) == 1)
+      g_rtbuf_position_cb(&g_rtbuf[rtb], x, y);
     rtbuf_var_print(v);
     printf("\n");
     return 0;
diff --git a/gtk/rtbuf_gtk.c b/gtk/rtbuf_gtk.c
index 4c15384..88d9347 100644
--- a/gtk/rtbuf_gtk.c
+++ b/gtk/rtbuf_gtk.c
@@ -474,13 +474,29 @@ void rtbuf_gtk_unlock ()
     g_mutex_unlock(&g_mutex);
 }
 
-void rtbuf_gtk_new_cb (s_rtbuf *rtbuf)
+void rtbuf_gtk_position_cb (s_rtbuf *rtbuf, short x, short y)
 {
-  if (rtbuf->user_ptr) {
+  s_rtbuf_gtk_rtbuf_info *info =
+    (s_rtbuf_gtk_rtbuf_info*) rtbuf->user_ptr;
+  if (!info) {
+    info = rtbuf_gtk_rtbuf_info_new();
+    rtbuf->user_ptr = info;
+    assert(info);
+    info->x = x;
+    info->y = y;
     rtbuf_gtk_lock();
     rtbuf_gtk_modular_layout_new(rtbuf);
     rtbuf_gtk_unlock();
   }
+  else {
+    info->x = x;
+    info->y = y;
+    rtbuf_gtk_lock();
+    gtk_layout_move(modular_layout,
+                    GTK_WIDGET(info->widget),
+                    x, y);
+    rtbuf_gtk_unlock();
+  }
 }
 
 void rtbuf_gtk_delete_cb (s_rtbuf *rtbuf)
@@ -573,7 +589,6 @@ void main_loop (void)
   struct timespec timeout;
   timeout.tv_sec = 0;
   timeout.tv_nsec = 1000;
-  g_mutex_init(&g_mutex);
   while (1) {
     int sleep = 1;
     if (rtbuf_cli_do_event())
@@ -593,8 +608,9 @@ void main_loop (void)
 
 int main (int argc, char *argv[])
 {
+  g_mutex_init(&g_mutex);
   symbols_init();
-  g_rtbuf_new_cb = rtbuf_gtk_new_cb;
+  g_rtbuf_position_cb = rtbuf_gtk_position_cb;
   g_rtbuf_delete_cb = rtbuf_gtk_delete_cb;
   g_rtbuf_bind_cb = rtbuf_gtk_bind_cb;
   g_rtbuf_unbind_cb = rtbuf_gtk_unbind_cb;