Commit 9fccc8100060015ee8ecd6e193a20aa6daef6453

Thomas de Grivel 2020-05-08T18:29:23

rtbuf-gtk input unbound value entry

diff --git a/gtk/rtbuf_input_widget.c b/gtk/rtbuf_input_widget.c
index 6036d23..26b509f 100644
--- a/gtk/rtbuf_input_widget.c
+++ b/gtk/rtbuf_input_widget.c
@@ -194,7 +194,8 @@ rtbuf_input_widget_get_check (RtbufInputWidget *widget)
   return NULL;
 }
 
-void rtbuf_input_widget_slider_value_changed (RtbufInputWidgetPrivate *priv)
+void rtbuf_input_widget_slider_value_changed
+(const RtbufInputWidgetPrivate *priv)
 {
   double value;
   double *unbound_value;
@@ -205,6 +206,27 @@ void rtbuf_input_widget_slider_value_changed (RtbufInputWidgetPrivate *priv)
   unbound_value = rtbuf_in_unbound_value(priv->rtbuf, priv->in);
   *unbound_value = value;
 }
+
+gboolean rtbuf_input_widget_value_key_press_event
+(const RtbufInputWidgetPrivate *priv, GdkEventKey *event)
+{
+  const char *str;
+  char str_mut[64];
+  double value;
+  double *unbound_value;
+  if (event->keyval == GDK_KEY_Return) {
+    str = gtk_entry_get_text(GTK_ENTRY(priv->value));
+    if (sscanf(str, "%lg", &value) == 1) {
+      snprintf(str_mut, sizeof(str_mut), "%lg", value);
+      gtk_entry_set_text(GTK_ENTRY(priv->value), str_mut);
+      gtk_range_set_value(GTK_RANGE(priv->slider), value);
+      unbound_value = rtbuf_in_unbound_value(priv->rtbuf, priv->in);
+      *unbound_value = value;
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
  
 void
 rtbuf_input_widget_update_rtbuf_in (RtbufInputWidget *widget)
@@ -237,6 +259,9 @@ rtbuf_input_widget_update_rtbuf_in (RtbufInputWidget *widget)
     g_signal_connect_swapped(priv->slider, "value-changed",
                              G_CALLBACK(rtbuf_input_widget_slider_value_changed),
                              priv);
+    g_signal_connect_swapped(priv->value, "key-press-event",
+                             G_CALLBACK(rtbuf_input_widget_value_key_press_event),
+                             priv);
   }
 }