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 fileCHANGELOG.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
### Addedpackage.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 issrc/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-quitsrc/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-quittest/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))))))