/* * Prints the wlroots struct layout facts the jolt compositor needs, as EDN. * wlroots changes struct layouts between minor versions, so these are read * from the installed headers rather than written down by hand. * * cc -o gen-offsets gen-offsets.c $(pkg-config --cflags wlroots-0.20 wayland-server pixman-1 xkbcommon) * ./gen-offsets > offsets.edn */ #define WLR_USE_UNSTABLE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define O(t, f) printf(" :%s/%s %zu\n", #t, name(#f), offsetof(struct t, f)) #define Z(t) printf(" :%s/sizeof %zu\n", #t, sizeof(struct t)) #define E(k, v) printf(" :enum/%s %d\n", k, (int)(v)) /* "events.new_output" -> "events.new_output" is a valid keyword name already; * keep dots, they read as paths. */ static const char *name(const char *f) { return f; } int main(void) { printf("{\n"); Z(wl_listener); O(wl_listener, link); O(wl_listener, notify); Z(wl_signal); Z(wl_list); Z(timespec); O(wlr_backend, events.new_input); O(wlr_backend, events.new_output); O(wlr_output, name); O(wlr_output, width); O(wlr_output, height); O(wlr_output, events.frame); O(wlr_output, events.request_state); O(wlr_output, events.destroy); Z(wlr_output_state); O(wlr_output_state, committed); O(wlr_output_state, buffer); E("output-state-buffer", WLR_OUTPUT_STATE_BUFFER); E("buffer-data-ptr-access-read", WLR_BUFFER_DATA_PTR_ACCESS_READ); O(wlr_output_event_request_state, state); O(wlr_scene, tree); O(wlr_scene_tree, node); O(wlr_scene_node, type); O(wlr_scene_node, parent); O(wlr_scene_node, enabled); O(wlr_scene_node, x); O(wlr_scene_node, y); O(wlr_scene_node, data); O(wlr_scene_surface, surface); O(wlr_scene_layer_surface_v1, tree); E("scene-node-tree", WLR_SCENE_NODE_TREE); E("scene-node-rect", WLR_SCENE_NODE_RECT); E("scene-node-buffer", WLR_SCENE_NODE_BUFFER); O(wlr_xdg_shell, events.new_toplevel); O(wlr_xdg_shell, events.new_popup); O(wlr_xdg_toplevel, base); O(wlr_xdg_toplevel, events.destroy); O(wlr_xdg_surface, surface); O(wlr_xdg_surface, role); O(wlr_xdg_surface, data); O(wlr_xdg_surface, initialized); O(wlr_xdg_surface, initial_commit); O(wlr_xdg_surface, geometry); O(wlr_xdg_popup, base); O(wlr_xdg_popup, parent); O(wlr_xdg_popup, events.destroy); O(wlr_xdg_popup, current.geometry); O(wlr_surface, mapped); O(wlr_surface, events.commit); O(wlr_surface, events.map); O(wlr_surface, events.unmap); O(wlr_surface, events.destroy); O(wlr_layer_shell_v1, events.new_surface); O(wlr_layer_surface_v1, surface); O(wlr_layer_surface_v1, output); O(wlr_layer_surface_v1, namespace); O(wlr_layer_surface_v1, current.keyboard_interactive); O(wlr_layer_surface_v1, current.layer); O(wlr_layer_surface_v1, initialized); O(wlr_layer_surface_v1, initial_commit); O(wlr_layer_surface_v1, events.destroy); O(wlr_layer_surface_v1, events.new_popup); O(wlr_layer_surface_v1, data); O(wlr_cursor, x); O(wlr_cursor, y); O(wlr_cursor, events.motion); O(wlr_cursor, events.motion_absolute); O(wlr_cursor, events.button); O(wlr_cursor, events.axis); O(wlr_cursor, events.frame); O(wlr_pointer, base); O(wlr_pointer_motion_event, pointer); O(wlr_pointer_motion_event, time_msec); O(wlr_pointer_motion_event, delta_x); O(wlr_pointer_motion_event, delta_y); O(wlr_pointer_motion_absolute_event, pointer); O(wlr_pointer_motion_absolute_event, time_msec); O(wlr_pointer_motion_absolute_event, x); O(wlr_pointer_motion_absolute_event, y); O(wlr_pointer_button_event, time_msec); O(wlr_pointer_button_event, button); O(wlr_pointer_button_event, state); O(wlr_pointer_axis_event, time_msec); O(wlr_pointer_axis_event, source); O(wlr_pointer_axis_event, orientation); O(wlr_pointer_axis_event, relative_direction); O(wlr_pointer_axis_event, delta); O(wlr_pointer_axis_event, delta_discrete); O(wlr_input_device, type); O(wlr_input_device, events.destroy); E("input-device-keyboard", WLR_INPUT_DEVICE_KEYBOARD); E("input-device-pointer", WLR_INPUT_DEVICE_POINTER); O(wlr_keyboard, keycodes); O(wlr_keyboard, num_keycodes); O(wlr_keyboard, modifiers); O(wlr_keyboard, events.key); O(wlr_keyboard, events.modifiers); O(wlr_keyboard_key_event, time_msec); O(wlr_keyboard_key_event, keycode); O(wlr_keyboard_key_event, state); O(wlr_seat, pointer_state.focused_client); O(wlr_seat, pointer_state.focused_surface); O(wlr_seat, keyboard_state.focused_surface); O(wlr_seat, events.request_set_cursor); O(wlr_seat, events.request_set_selection); O(wlr_seat, events.request_set_primary_selection); O(wlr_seat_pointer_request_set_cursor_event, seat_client); O(wlr_seat_pointer_request_set_cursor_event, surface); O(wlr_seat_pointer_request_set_cursor_event, hotspot_x); O(wlr_seat_pointer_request_set_cursor_event, hotspot_y); O(wlr_seat_request_set_selection_event, source); O(wlr_seat_request_set_selection_event, serial); O(wlr_seat_request_set_primary_selection_event, source); O(wlr_seat_request_set_primary_selection_event, serial); Z(wlr_box); O(wlr_box, x); O(wlr_box, y); O(wlr_box, width); O(wlr_box, height); E("seat-capability-pointer", WL_SEAT_CAPABILITY_POINTER); E("seat-capability-keyboard", WL_SEAT_CAPABILITY_KEYBOARD); E("button-pressed", WL_POINTER_BUTTON_STATE_PRESSED); printf("}\n"); return 0; }