aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/unix/slider.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/unix/slider.c')
-rw-r--r--src/libui_sdl/libui/unix/slider.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/unix/slider.c b/src/libui_sdl/libui/unix/slider.c
new file mode 100644
index 0000000..7f0cc24
--- /dev/null
+++ b/src/libui_sdl/libui/unix/slider.c
@@ -0,0 +1,71 @@
+// 11 june 2015
+#include "uipriv_unix.h"
+
+struct uiSlider {
+ uiUnixControl c;
+ GtkWidget *widget;
+ GtkRange *range;
+ GtkScale *scale;
+ void (*onChanged)(uiSlider *, void *);
+ void *onChangedData;
+ gulong onChangedSignal;
+};
+
+uiUnixControlAllDefaults(uiSlider)
+
+static void onChanged(GtkRange *range, gpointer data)
+{
+ uiSlider *s = uiSlider(data);
+
+ (*(s->onChanged))(s, s->onChangedData);
+}
+
+static void defaultOnChanged(uiSlider *s, void *data)
+{
+ // do nothing
+}
+
+int uiSliderValue(uiSlider *s)
+{
+ return gtk_range_get_value(s->range);
+}
+
+void uiSliderSetValue(uiSlider *s, int value)
+{
+ // we need to inhibit sending of ::value-changed because this WILL send a ::value-changed otherwise
+ g_signal_handler_block(s->range, s->onChangedSignal);
+ gtk_range_set_value(s->range, value);
+ g_signal_handler_unblock(s->range, s->onChangedSignal);
+}
+
+void uiSliderOnChanged(uiSlider *s, void (*f)(uiSlider *, void *), void *data)
+{
+ s->onChanged = f;
+ s->onChangedData = data;
+}
+
+uiSlider *uiNewSlider(int min, int max)
+{
+ uiSlider *s;
+ int temp;
+
+ if (min >= max) {
+ temp = min;
+ min = max;
+ max = temp;
+ }
+
+ uiUnixNewControl(uiSlider, s);
+
+ s->widget = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, min, max, 1);
+ s->range = GTK_RANGE(s->widget);
+ s->scale = GTK_SCALE(s->widget);
+
+ // ensure integers, just to be safe
+ gtk_scale_set_digits(s->scale, 0);
+
+ s->onChangedSignal = g_signal_connect(s->scale, "value-changed", G_CALLBACK(onChanged), s);
+ uiSliderOnChanged(s, defaultOnChanged, NULL);
+
+ return s;
+}