Skip to content

Commit a64c398

Browse files
committed
feat: remove wayland-scanner dependency by generating needed C code, improve listeners
1 parent 4bbc3e7 commit a64c398

File tree

9 files changed

+509
-185
lines changed

9 files changed

+509
-185
lines changed

build.vsh

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/usr/bin/env -S v
22

3+
import os
34
import term
45

56
fn sh(cmd string) string {
@@ -51,7 +52,6 @@ if arguments().contains('clean') {
5152
}
5253
5354
program_installed('pkg-config')
54-
program_installed('wayland-scanner')
5555
5656
pkg_installed('wayland-protocols', '1.41')
5757
pkg_installed('wayland-client', none)
@@ -79,22 +79,17 @@ protocols := [
7979
8080
sh('mkdir -p ${protocols_dir}')
8181
82+
if !os.exists('${protocols_dir}/vscanner_wl_types.h') {
83+
sh('cp ./protocols/vscanner_wl_types.h ${protocols_dir}/')
84+
}
85+
8286
for protocol in protocols {
8387
name := base(protocol).replace('.xml', '').replace('-', '_')
8488
sh('${vscanner_dir}/vscanner ${protocol} ${protocols_dir}/${name}')
85-
86-
// Generate C protocol files for non-core protocols
87-
if !protocol.contains('wayland.xml') {
88-
// Use module name (with underscores) for C files to match vscanner output
89-
header_file := '${protocols_dir}/${name}/${name}-client-protocol.h'
90-
code_file := '${protocols_dir}/${name}/${name}-protocol.c'
91-
sh('wayland-scanner client-header ${protocol} ${header_file}')
92-
sh('wayland-scanner private-code ${protocol} ${code_file}')
93-
}
9489
}
9590
9691
if arguments().contains('install') {
97-
sh('v -prod .')
92+
sh('v -enable-globals -prod .')
9893
user := sh('logname').trim_space()
9994
sh('chown ${user}:${user} ./${exe_name}')
10095
sh('chown -R ${user}:${user} ./${protocols_dir}')

color_management.v

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,52 +2,56 @@ module main
22

33
import protocols.color_management_v1 as cm
44

5-
fn handle_cm_image_description_info_done(mut state State, proxy voidptr) {
6-
state.n_cm_done++
5+
fn handle_cm_image_description_info_done(data voidptr, obj voidptr) {
6+
mut state := unsafe { &State(data) }
7+
state.n_cm_done++
78
}
89

9-
fn handle_cm_image_description_info_tf_named(mut state State, info &cm.WpImageDescriptionInfoV1, tf u32) {
10+
fn handle_cm_image_description_info_tf_named(data voidptr, obj voidptr, tf u32) {
11+
mut state := unsafe { &State(data) }
1012
state.is_hdr = tf & u32(cm.WpColorManagerV1_TransferFunction.st2084_pq) != 0
1113
}
1214

13-
const cm_image_description_info_listener = C.wp_image_description_info_v1_listener{
14-
done: handle_cm_image_description_info_done
15-
icc_file: fn (_ voidptr, _ voidptr, _ int, _ u32) {}
16-
primaries: fn (_ voidptr, _ voidptr, _ int, _ int, _ int, _ int, _ int, _ int, _ int, _ int) {}
17-
primaries_named: fn (_ voidptr, _ voidptr, _ u32) {}
18-
tf_power: fn (_ voidptr, _ voidptr, _ u32) {}
19-
tf_named: handle_cm_image_description_info_tf_named
20-
luminances: fn (_ voidptr, _ voidptr, _ u32, _ u32, _ u32) {}
21-
target_primaries: fn (_ voidptr, _ voidptr, _ int, _ int, _ int, _ int, _ int, _ int, _ int, _ int) {}
22-
target_luminance: fn (_ voidptr, _ voidptr, _ u32, _ u32) {}
23-
target_max_cll: fn (_ voidptr, _ voidptr, _ u32) {}
24-
target_max_fall: fn (_ voidptr, _ voidptr, _ u32) {}
25-
}
26-
27-
fn handle_cm_image_description_ready(mut state State, description_proxy voidptr, identity u32) {
15+
const cm_image_description_info_listener = cm.wpimagedescriptioninfov1_listener(
16+
handle_cm_image_description_info_done, // done
17+
none, // icc_file
18+
none, // primaries
19+
none, // primaries_named
20+
none, // tf_power
21+
handle_cm_image_description_info_tf_named, // tf_named
22+
none, // luminances
23+
none, // target_primaries
24+
none, // target_luminance
25+
none, // target_max_cll
26+
none // target_max_fall
27+
)
28+
29+
fn handle_cm_image_description_ready(data voidptr, description_proxy voidptr, identity u32) {
30+
mut state := unsafe { &State(data) }
2831
mut desc := &cm.WpImageDescriptionV1{
2932
proxy: description_proxy
3033
}
3134
mut info := desc.get_information()
3235
info.add_listener(&cm_image_description_info_listener, state)
3336
}
3437

35-
fn handle_cm_image_description_failed(mut state State, description &cm.WpImageDescriptionV1, cause u32, msg &char) {
38+
fn handle_cm_image_description_failed(data voidptr, description &cm.WpImageDescriptionV1, cause u32, msg &char) {
3639
msg_str := unsafe { msg.vstring() }
3740
eprintln('Image description failed: ${msg_str} (cause: ${cause})')
3841
}
3942

40-
const cm_image_description_listener = C.wp_image_description_v1_listener{
41-
failed: handle_cm_image_description_failed
42-
ready: handle_cm_image_description_ready
43-
ready2: fn (_ voidptr, _ voidptr, _ u32, _ u32) {}
44-
}
43+
const cm_image_description_listener = cm.wpimagedescriptionv1_listener(
44+
handle_cm_image_description_failed, // failed
45+
handle_cm_image_description_ready, // ready
46+
none // ready2
47+
)
4548

46-
fn handle_cm_output_image_description_changed(mut state State, mut cm_output cm.WpColorManagementOutputV1) {
49+
fn handle_cm_output_image_description_changed(data voidptr, mut cm_output cm.WpColorManagementOutputV1) {
50+
mut state := unsafe { &State(data) }
4751
mut description := cm_output.get_image_description()
4852
description.add_listener(&cm_image_description_listener, state)
4953
}
5054

51-
const cm_output_listener = C.wp_color_management_output_v1_listener{
52-
image_description_changed: handle_cm_output_image_description_changed
53-
}
55+
const cm_output_listener = cm.wpcolormanagementoutputv1_listener(
56+
handle_cm_output_image_description_changed // image_description_changed
57+
)

copy_capture.v

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,32 @@ import math
44
import protocols.wayland as wlp
55
import protocols.ext_image_copy_capture_v1 as cc
66

7-
fn frame_handle_transform(mut capture Capture, frame &cc.ExtImageCopyCaptureFrameV1, transform u32) {
7+
fn frame_handle_transform(data voidptr, obj voidptr, transform u32) {
8+
mut capture := unsafe { &Capture(data) }
89
capture.transform = unsafe { wlp.WlOutput_Transform(transform) }
910
}
1011

11-
fn frame_handle_ready(mut capture Capture, frame &cc.ExtImageCopyCaptureFrameV1) {
12+
fn frame_handle_ready(data voidptr, obj voidptr) {
13+
mut capture := unsafe { &Capture(data) }
1214
capture.state.n_done++
1315
}
1416

15-
fn frame_handle_failed(capture &Capture, frame &cc.ExtImageCopyCaptureFrameV1, reason u32) {
17+
fn frame_handle_failed(data voidptr, obj voidptr, reason u32) {
18+
capture := unsafe { &Capture(data) }
1619
name := if output := capture.output { output.name } else { 'unknown' }
1720
panic('failed to copy output ${name}, reason: ${reason}')
1821
}
1922

20-
const frame_listener = C.ext_image_copy_capture_frame_v1_listener{
21-
transform: frame_handle_transform
22-
damage: fn (_ voidptr, _ voidptr, _ int, _ int, _ int, _ int) {}
23-
presentation_time: fn (_ voidptr, _ voidptr, _ u32, _ u32, _ u32) {}
24-
ready: frame_handle_ready
25-
failed: frame_handle_failed
26-
}
23+
const frame_listener = cc.extimagecopycaptureframev1_listener(
24+
frame_handle_transform, // transform
25+
none, // damage
26+
none, // presentation_time
27+
frame_handle_ready, // ready
28+
frame_handle_failed // failed
29+
)
2730

28-
fn session_handle_buffer_size(mut capture Capture, session &cc.ExtImageCopyCaptureSessionV1, width u32, height u32) {
31+
fn session_handle_buffer_size(data voidptr, obj voidptr, width u32, height u32) {
32+
mut capture := unsafe { &Capture(data) }
2933
capture.buffer_width = width
3034
capture.buffer_height = height
3135
if capture.output == none {
@@ -34,7 +38,8 @@ fn session_handle_buffer_size(mut capture Capture, session &cc.ExtImageCopyCaptu
3438
}
3539
}
3640

37-
fn session_handle_shm_format(mut capture Capture, session &cc.ExtImageCopyCaptureSessionV1, format u32) {
41+
fn session_handle_shm_format(data voidptr, obj voidptr, format u32) {
42+
mut capture := unsafe { &Capture(data) }
3843
fmt := unsafe { wlp.WlShm_Format(format) }
3944
is_toplevel := capture.toplevel != none
4045
if current_fmt := capture.shm_format {
@@ -50,7 +55,8 @@ fn session_handle_shm_format(mut capture Capture, session &cc.ExtImageCopyCaptur
5055
capture.shm_format = fmt
5156
}
5257

53-
fn session_handle_done(mut capture Capture, session &cc.ExtImageCopyCaptureSessionV1) {
58+
fn session_handle_done(data voidptr, obj voidptr) {
59+
mut capture := unsafe { &Capture(data) }
5460
if capture.ext_image_copy_capture_frame_v1 != none {
5561
return
5662
}
@@ -73,14 +79,14 @@ fn session_handle_done(mut capture Capture, session &cc.ExtImageCopyCaptureSessi
7379
frame.capture()
7480
}
7581

76-
const session_listener = C.ext_image_copy_capture_session_v1_listener{
77-
buffer_size: session_handle_buffer_size
78-
shm_format: session_handle_shm_format
79-
dmabuf_device: fn (_ voidptr, _ voidptr, _ voidptr) {}
80-
dmabuf_format: fn (_ voidptr, _ voidptr, _ u32, _ voidptr) {}
81-
done: session_handle_done
82-
stopped: fn (_ voidptr, _ voidptr) {}
83-
}
82+
const session_listener = cc.extimagecopycapturesessionv1_listener(
83+
session_handle_buffer_size, // buffer_size
84+
session_handle_shm_format, // shm_format
85+
none, // dmabuf_device
86+
none, // dmabuf_format
87+
session_handle_done, // done
88+
none // stopped
89+
)
8490

8591
fn is_alpha_format(format wlp.WlShm_Format) bool {
8692
alpha_formats := [wlp.WlShm_Format.argb8888, .abgr8888, .bgra8888, .rgba8888, .argb2101010, .abgr2101010]

foreign_toplevel.v

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,21 @@ module main
22

33
import protocols.ext_foreign_toplevel_list_v1 as ft
44

5-
fn foreign_toplevel_handle_identifier(mut toplevel &Toplevel, toplevel_handle voidptr, identifier &char) {
5+
fn foreign_toplevel_handle_identifier(data voidptr, obj voidptr, identifier &char) {
6+
mut toplevel := unsafe { &Toplevel(data) }
67
toplevel.identifier = unsafe { identifier.vstring() }
78
}
89

9-
const foreign_toplevel_listener = C.ext_foreign_toplevel_handle_v1_listener{
10-
closed: fn (_ voidptr, _ voidptr) {}
11-
done: fn (_ voidptr, _ voidptr) {}
12-
title: fn (_ voidptr, _ voidptr, _ &char) {}
13-
app_id: fn (_ voidptr, _ voidptr, _ &char) {}
14-
identifier: foreign_toplevel_handle_identifier
15-
}
10+
const foreign_toplevel_listener = ft.extforeigntoplevelhandlev1_listener(
11+
none, // closed
12+
none, // done
13+
none, // title
14+
none, // app_id
15+
foreign_toplevel_handle_identifier // identifier
16+
)
1617

17-
fn foreign_toplevel_list_handle_toplevel(mut state &State, list voidptr, toplevel_handle voidptr) {
18+
fn foreign_toplevel_list_handle_toplevel(data voidptr, obj voidptr, toplevel_handle voidptr) {
19+
mut state := unsafe { &State(data) }
1820
mut handle := &ft.ExtForeignToplevelHandleV1{
1921
proxy: toplevel_handle
2022
}
@@ -25,7 +27,7 @@ fn foreign_toplevel_list_handle_toplevel(mut state &State, list voidptr, topleve
2527
state.toplevels << toplevel
2628
}
2729

28-
const foreign_toplevel_list_listener = C.ext_foreign_toplevel_list_v1_listener{
29-
toplevel: foreign_toplevel_list_handle_toplevel
30-
finished: fn (_ voidptr, _ voidptr) {}
31-
}
30+
const foreign_toplevel_list_listener = ft.extforeigntoplevellistv1_listener(
31+
foreign_toplevel_list_handle_toplevel, // toplevel
32+
none // finished
33+
)

overlay.v

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
module main
22

33
import wl
4+
import protocols.wayland as wlp
45
import protocols.wlr_layer_shell_unstable_v1 as ls
56

67
// needed for xdg_popup interface
78
import protocols.xdg_shell as _
89

9-
fn layer_surface_v1_configure(mut overlay Overlay, _ voidptr, serial u32, _ u32, _ u32) {
10+
fn layer_surface_v1_configure(data voidptr, obj voidptr, serial u32, width u32, height u32) {
11+
mut overlay := unsafe { &Overlay(data) }
1012
if mut layer_surface := overlay.layer_surface_v1 {
1113
layer_surface.ack_configure(serial)
1214
}
@@ -15,21 +17,26 @@ fn layer_surface_v1_configure(mut overlay Overlay, _ voidptr, serial u32, _ u32,
1517
}
1618
}
1719

18-
fn layer_surface_v1_closed(mut overlay Overlay, _ voidptr) {
20+
fn layer_surface_v1_closed(data voidptr, obj voidptr) {
1921
panic('Layer surface died unexpectedly')
2022
}
2123

22-
const layer_surface_listener = C.zwlr_layer_surface_v1_listener{
23-
configure: layer_surface_v1_configure
24-
closed: layer_surface_v1_closed
25-
}
24+
const layer_surface_listener = ls.zwlrlayersurfacev1_listener(
25+
layer_surface_v1_configure, // configure
26+
layer_surface_v1_closed // closed
27+
)
2628

27-
const surface_listener = C.wl_surface_listener{
28-
enter: fn (_ voidptr, _ voidptr, _ voidptr) {}
29-
leave: fn (_ voidptr, _ voidptr, _ voidptr) {}
30-
preferred_buffer_scale: fn (_ voidptr, _ voidptr, _ int) {}
31-
preferred_buffer_transform: fn (_ voidptr, _ voidptr, _ u32) {}
32-
}
29+
fn surface_enter(data voidptr, obj voidptr, output voidptr) {}
30+
fn surface_leave(data voidptr, obj voidptr, output voidptr) {}
31+
fn surface_preferred_buffer_scale(data voidptr, obj voidptr, factor int) {}
32+
fn surface_preferred_buffer_transform(data voidptr, obj voidptr, transform u32) {}
33+
34+
const surface_listener = wlp.wlsurface_listener(
35+
surface_enter, // enter
36+
surface_leave, // leave
37+
surface_preferred_buffer_scale, // preferred_buffer_scale
38+
surface_preferred_buffer_transform // preferred_buffer_transform
39+
)
3340

3441
fn Overlay.new(capture &Capture) &Overlay {
3542
mut overlay := &Overlay{
@@ -61,7 +68,7 @@ fn Overlay.new(capture &Capture) &Overlay {
6168
mut wlr_layer_shell := capture.state.wlr_layer_shell_v1 or { panic('No layer shell init') }
6269

6370
mut layer_surface := wlr_layer_shell.get_layer_surface(surface.proxy, output.wl_output.proxy,
64-
u32(ls.ZwlrLayerShellV1_Layer.overlay), 'mrpenishot')
71+
u32(ls.ZwlrLayerShellV1_Layer.overlay), 'mrpenishot'.str)
6572
overlay.layer_surface_v1 = layer_surface
6673
if layer_surface == unsafe { nil } {
6774
panic('Failed to get layer surface')

registry.v

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ import protocols.ext_foreign_toplevel_list_v1 as ft
1010
import protocols.viewporter as vp
1111
import protocols.wlr_layer_shell_unstable_v1 as ls
1212

13-
fn registry_handle_global(mut state State, registry voidptr, name u32, iface &char, version u32) {
13+
fn registry_handle_global(data voidptr, obj voidptr, name u32, iface &char, version u32) {
14+
mut state := unsafe { &State(data) }
1415
interface_name := unsafe { iface.vstring() }
1516

1617
match interface_name {
@@ -70,7 +71,7 @@ fn registry_handle_global(mut state State, registry voidptr, name u32, iface &ch
7071
}
7172
}
7273

73-
const registry_listener = C.wl_registry_listener{
74-
global: registry_handle_global
75-
global_remove: fn (_ voidptr, _ voidptr, _ u32) {}
76-
}
74+
const registry_listener = wlp.wlregistry_listener(
75+
registry_handle_global, // global
76+
none // global_remove
77+
)

0 commit comments

Comments
 (0)