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;