Commite492012bRecorded21 Sep 2026Repositorysigil-app

Release 0.10.2: the mouse wheel

Message

(mouse-wheel) answers the wheel's vertical travel since the last frame and (mouse-wheel-x) the horizontal, in GLFW's units (a notch is 1.0 on most mice; vertical + is away from the user), summed over the frame from GLFW's scroll callback and cleared with the other per-frame input. Without a window both answer 0.0. Wanted by Crash The Stack's tracker, where the wheel scrolls the pattern (David, 2026-09-21). test-keys 47.

Changed
 .sigil/deps/sigil-build       |  1 +
 .sigil/deps/sigil-crypto      |  1 +
 .sigil/deps/sigil-deps        |  1 +
 .sigil/deps/sigil-desktop     |  1 +
 .sigil/deps/sigil-git         |  1 +
 .sigil/deps/sigil-json        |  1 +
 .sigil/deps/sigil-lib         |  1 +
 .sigil/deps/sigil-package     |  1 +
 .sigil/deps/sigil-sqlite      |  1 +
 .sigil/deps/sigil-store       |  1 +
 .sigil/deps/sigil-test        |  1 +
 .sigil/deps/sigil-test-runner |  1 +
 CHANGELOG.md                  | 11 +++++++++++
 package.sgl                   |  2 +-
 src/c/desktop-internal.h      |  4 ++++
 src/c/desktop.c               | 33 +++++++++++++++++++++++++++++++++
 src/sigil/app.sgl             |  2 +-
 src/sigil/desktop.sgl         |  2 +-
 test/test-keys.sgl            |  7 +++++++
 19 files changed, 70 insertions(+), 3 deletions(-)
Diff
.sigil/deps/sigil-buildadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-build
2
No newline at end of file
.sigil/deps/sigil-cryptoadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-crypto-71362137db0596e0695791b32c4f6e8faf11b39e
2
No newline at end of file
.sigil/deps/sigil-depsadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-deps
2
No newline at end of file
.sigil/deps/sigil-desktopadded
@@ -0,0 +1 @@
+1
/home/daviwil/Projects/Code/sigil/task-sigil-desktop-keys/.
2
No newline at end of file
.sigil/deps/sigil-gitadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-git
2
No newline at end of file
.sigil/deps/sigil-jsonadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-json-55c9e74712b5f79b45d41c65cfe0aef2c8f7e155
2
No newline at end of file
.sigil/deps/sigil-libadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-8643e9abf19038c5f4961d41748427dbd623cb15/packages/sigil-lib
2
No newline at end of file
.sigil/deps/sigil-packageadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-package
2
No newline at end of file
.sigil/deps/sigil-sqliteadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-sqlite-569ef1063dda8f5989968644af31fc09c64b4bfe
2
No newline at end of file
.sigil/deps/sigil-storeadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-store
2
No newline at end of file
.sigil/deps/sigil-testadded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-test
2
No newline at end of file
.sigil/deps/sigil-test-runneradded
@@ -0,0 +1 @@
+1
/home/daviwil/.sigil/deps/codeberg-sigil-sigil-5b494e16de01635a1aa3dbcfac5abffd1acdc2ed/packages/sigil-test-runner
2
No newline at end of file
CHANGELOG.mdmodified
@@ -7,6 +7,17 @@ All notable changes to this project will be documented in this file.
7
The format is based on [Keep a Changelog](https://keepachangelog.com/),
8
and this project adheres to [Semantic Versioning](https://semver.org/).
9
+10
## [0.10.2] - 2026-09-21
+11
+12
### Added
+13
+14
- **The mouse wheel.** `(mouse-wheel)` answers the wheel's vertical travel
+15
since the last frame and `(mouse-wheel-x)` the horizontal, in GLFW's
+16
units (a notch is 1.0 on most mice; vertical + is away from the user),
+17
summed over the frame from GLFW's scroll callback and cleared with the
+18
other per-frame input. Without a window both answer 0.0. Wanted by Crash
+19
The Stack's tracker (the wheel scrolls the pattern; David, 2026-09-21).
+20
21
## [0.10.1] - 2026-09-20
22
23
### Added
package.sglmodified
@@ -124,7 +124,7 @@
124
125
(package
126
name: "sigil-desktop"
−127
version: "0.10.1"
+127
version: "0.10.2"
128
sigil: "0.20"
129
description: "Desktop host layer for Sigil (window, GL context, input, frame clock) over GLFW"
130
;; The repository was sigil/sigil-app on Codeberg through 0.9.x and is
src/c/desktop-internal.hmodified
@@ -60,6 +60,10 @@ typedef struct {
60
* mouse-x / mouse-y scale it into framebuffer pixels on read. */
61
double cursor_x;
62
double cursor_y;
+63
/* The wheel since the last frame (0.10.2): GLFW's scroll offsets
+64
* summed, cleared with the other per-frame input; + is up/right. */
+65
double wheel_x;
+66
double wheel_y;
67
68
/* Quit handling */
69
bool quit_requested;
src/c/desktop.cmodified
@@ -63,6 +63,8 @@ void sigil_desktop_clear_frame_input(void)
63
memset(g_desktop->keys_released, 0, sizeof(g_desktop->keys_released));
64
memset(g_desktop->mouse_pressed, 0, sizeof(g_desktop->mouse_pressed));
65
memset(g_desktop->mouse_released, 0, sizeof(g_desktop->mouse_released));
+66
g_desktop->wheel_x = 0.0;
+67
g_desktop->wheel_y = 0.0;
68
}
69
70
int sigil_desktop_framebuffer_width(void)
@@ -237,6 +239,14 @@ static void mouse_button_callback(GLFWwindow *window, int button, int action, in
239
}
240
}
241
+242
static void scroll_callback(GLFWwindow *window, double dx, double dy)
+243
{
+244
(void)window;
+245
if (!g_desktop) return;
+246
g_desktop->wheel_x += dx;
+247
g_desktop->wheel_y += dy;
+248
}
+249
250
static void cursor_pos_callback(GLFWwindow *window, double x, double y)
251
{
252
(void)window;
@@ -423,6 +433,7 @@ static bool run_main_loop(const char *title, int width, int height)
433
glfwSetKeyCallback(window, key_callback);
434
glfwSetMouseButtonCallback(window, mouse_button_callback);
435
glfwSetCursorPosCallback(window, cursor_pos_callback);
+436
glfwSetScrollCallback(window, scroll_callback);
437
glfwSetWindowCloseCallback(window, window_close_callback);
438
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
439
glfwSetWindowSizeCallback(window, window_size_callback);
@@ -580,6 +591,24 @@ static Value native_mouse_x(SigilVM *vm, int argc, Value *args)
591
return sigil_flonum(cursor_to_fb_x());
592
}
593
+594
/*
+595
* (mouse-wheel) -> float: the wheel's vertical travel since the last frame
+596
* in GLFW's units (a notch is 1.0 on most mice; + is away from the user),
+597
* summed over the frame and cleared with the other per-frame input.
+598
* (mouse-wheel-x) the horizontal travel the same way.
+599
*/
+600
static Value native_mouse_wheel(SigilVM *vm, int argc, Value *args)
+601
{
+602
(void)vm; (void)argc; (void)args;
+603
return sigil_flonum(g_desktop ? g_desktop->wheel_y : 0.0);
+604
}
+605
+606
static Value native_mouse_wheel_x(SigilVM *vm, int argc, Value *args)
+607
{
+608
(void)vm; (void)argc; (void)args;
+609
return sigil_flonum(g_desktop ? g_desktop->wheel_x : 0.0);
+610
}
+611
612
/*
613
* (mouse-y) -> float, framebuffer pixels
614
*/
@@ -724,6 +753,10 @@ void sigil__init_sigil_desktop_module(SigilVM *vm)
753
SIGIL_ARITY_EXACT(0), "Mouse X position");
754
sigil_module_register_native(vm, "mouse-y", native_mouse_y,
755
SIGIL_ARITY_EXACT(0), "Mouse Y position");
+756
sigil_module_register_native(vm, "mouse-wheel", native_mouse_wheel,
+757
SIGIL_ARITY_EXACT(0), "Wheel travel since the last frame (vertical)");
+758
sigil_module_register_native(vm, "mouse-wheel-x", native_mouse_wheel_x,
+759
SIGIL_ARITY_EXACT(0), "Wheel travel since the last frame (horizontal)");
760
sigil_module_register_native(vm, "mouse-down?", native_mouse_down,
761
SIGIL_ARITY_EXACT(1), "Is mouse button held?");
762
sigil_module_register_native(vm, "mouse-pressed?", native_mouse_pressed,
src/sigil/app.sglmodified
@@ -19,7 +19,7 @@
19
app-run
20
frame-width frame-height
21
frame-time time-elapsed
−22
mouse-x mouse-y
+22
mouse-x mouse-y mouse-wheel mouse-wheel-x
23
mouse-down? mouse-pressed? mouse-released?
24
key-down? key-pressed? key-released?
25
quit-requested? request-quit
src/sigil/desktop.sglmodified
@@ -16,7 +16,7 @@
16
app-run
17
frame-width frame-height
18
frame-time time-elapsed
−19
mouse-x mouse-y
+19
mouse-x mouse-y mouse-wheel mouse-wheel-x
20
mouse-down? mouse-pressed? mouse-released?
21
key-down? key-pressed? key-released? key-code
22
quit-requested? request-quit
test/test-keys.sglmodified
@@ -34,3 +34,10 @@
34
35
(test-group "key-code: not a symbol"
36
(test "a string is no key" (assert-equal #f (key-code "a"))))
+37
+38
;; 0.10.2: the wheel. Without a window there is no wheel; the natives answer
+39
;; 0.0 (a float), so a program can read them every frame unconditionally.
+40
(test-group "mouse-wheel: readable without a window"
+41
(test "vertical travel is 0.0 with no window" (assert-equal 0.0 (mouse-wheel)))
+42
(test "horizontal travel is 0.0 with no window" (assert-equal 0.0 (mouse-wheel-x)))
+43
(test "both answer numbers" (assert-true (and (number? (mouse-wheel)) (number? (mouse-wheel-x))))))