1package wayland
2
3// Raw-wire test clients intentionally keep raw requests (including invalid ones).
4// Their receivers nevertheless obey the real client's context, schema and
5// destructor contracts. Metadata comes from generated protocol descriptions;
6// request opcode numbers alone never determine object type or destruction.
7import (
8 "encoding/binary"
9 "strings"
10 "sync"
11 "testing"
12
13 wire_alphamodifier "github.com/bnema/go-wayland-bindings/server/alphamodifier"
14 wire_colormanagement "github.com/bnema/go-wayland-bindings/server/colormanagement"
15 wire_colorrepresentation "github.com/bnema/go-wayland-bindings/server/colorrepresentation"
16 wire_committiming "github.com/bnema/go-wayland-bindings/server/committiming"
17 wire_cursorshape "github.com/bnema/go-wayland-bindings/server/cursorshape"
18 wire_drmlease "github.com/bnema/go-wayland-bindings/server/drmlease"
19 wire_extdatacontrol "github.com/bnema/go-wayland-bindings/server/extdatacontrol"
20 wire_extidlenotify "github.com/bnema/go-wayland-bindings/server/extidlenotify"
21 wire_extimagecapturesource "github.com/bnema/go-wayland-bindings/server/extimagecapturesource"
22 wire_extimagecopycapture "github.com/bnema/go-wayland-bindings/server/extimagecopycapture"
23 wire_extsessionlock "github.com/bnema/go-wayland-bindings/server/extsessionlock"
24 wire_extworkspace "github.com/bnema/go-wayland-bindings/server/extworkspace"
25 wire_fifo "github.com/bnema/go-wayland-bindings/server/fifo"
26 wire_fractionalscale "github.com/bnema/go-wayland-bindings/server/fractionalscale"
27 wire_idleinhibit "github.com/bnema/go-wayland-bindings/server/idleinhibit"
28 wire_inputmethod "github.com/bnema/go-wayland-bindings/server/inputmethod"
29 wire_keyboardshortcutsinhibit "github.com/bnema/go-wayland-bindings/server/keyboardshortcutsinhibit"
30 wire_linuxdmabuf "github.com/bnema/go-wayland-bindings/server/linuxdmabuf"
31 wire_linuxdrmsyncobj "github.com/bnema/go-wayland-bindings/server/linuxdrmsyncobj"
32 wire_pointerconstraints "github.com/bnema/go-wayland-bindings/server/pointerconstraints"
33 wire_pointerwarp "github.com/bnema/go-wayland-bindings/server/pointerwarp"
34 wire_presentationtime "github.com/bnema/go-wayland-bindings/server/presentationtime"
35 wire_primaryselection "github.com/bnema/go-wayland-bindings/server/primaryselection"
36 wire_relativepointer "github.com/bnema/go-wayland-bindings/server/relativepointer"
37 wire_securitycontext "github.com/bnema/go-wayland-bindings/server/securitycontext"
38 wire_kdedecoration "github.com/bnema/go-wayland-bindings/server/serverdecoration"
39 wire_tearingcontrol "github.com/bnema/go-wayland-bindings/server/tearingcontrol"
40 wire_textinput "github.com/bnema/go-wayland-bindings/server/textinput"
41 wire_viewporter "github.com/bnema/go-wayland-bindings/server/viewporter"
42 wire_virtualkeyboard "github.com/bnema/go-wayland-bindings/server/virtualkeyboard"
43 wire_wayland "github.com/bnema/go-wayland-bindings/server/wayland"
44 wire_wlrforeigntoplevel "github.com/bnema/go-wayland-bindings/server/wlrforeigntoplevelmanagement"
45 wire_wlrlayershell "github.com/bnema/go-wayland-bindings/server/wlrlayershell"
46 wire_wlroutputmanagement "github.com/bnema/go-wayland-bindings/server/wlroutputmanagement"
47 wire_wlroutputpower "github.com/bnema/go-wayland-bindings/server/wlroutputpowermanagement"
48 wire_wlrscreencopy "github.com/bnema/go-wayland-bindings/server/wlrscreencopy"
49 wire_xdgactivation "github.com/bnema/go-wayland-bindings/server/xdgactivation"
50 wire_xdgoutput "github.com/bnema/go-wayland-bindings/server/xdgoutput"
51 wire_xdgshell "github.com/bnema/go-wayland-bindings/server/xdgshell"
52 wire_imagecapture "github.com/bnema/neferwl/internal/adapters/wayland/imagecapture"
53 "github.com/bnema/purego-libwayland/server"
54 "github.com/bnema/wlturbo"
55 client_alphamodifier "github.com/bnema/wlturbo/protocol/alphamodifier"
56 client_colormanagement "github.com/bnema/wlturbo/protocol/colormanagement"
57 client_colorrepresentation "github.com/bnema/wlturbo/protocol/colorrepresentation"
58 client_committiming "github.com/bnema/wlturbo/protocol/committiming"
59 client_core "github.com/bnema/wlturbo/protocol/core"
60 client_cursorshape "github.com/bnema/wlturbo/protocol/cursorshape"
61 client_datacontrol "github.com/bnema/wlturbo/protocol/datacontrol"
62 client_drmlease "github.com/bnema/wlturbo/protocol/drmlease"
63 client_drmsyncobj "github.com/bnema/wlturbo/protocol/drmsyncobj"
64 client_extsessionlock "github.com/bnema/wlturbo/protocol/extsessionlock"
65 client_fifo "github.com/bnema/wlturbo/protocol/fifo"
66 client_foreigntoplevel "github.com/bnema/wlturbo/protocol/foreigntoplevel"
67 client_fractionalscale "github.com/bnema/wlturbo/protocol/fractionalscale"
68 client_idleinhibit "github.com/bnema/wlturbo/protocol/idleinhibit"
69 client_idlenotify "github.com/bnema/wlturbo/protocol/idlenotify"
70 client_imagecapturesource "github.com/bnema/wlturbo/protocol/imagecapturesource"
71 client_imagecopycapture "github.com/bnema/wlturbo/protocol/imagecopycapture"
72 client_inputmethod "github.com/bnema/wlturbo/protocol/inputmethod"
73 client_kdeserverdecoration "github.com/bnema/wlturbo/protocol/kdeserverdecoration"
74 client_layershell "github.com/bnema/wlturbo/protocol/layershell"
75 client_linuxdmabuf "github.com/bnema/wlturbo/protocol/linuxdmabuf"
76 client_outputmanagement "github.com/bnema/wlturbo/protocol/outputmanagement"
77 client_outputpower "github.com/bnema/wlturbo/protocol/outputpower"
78 client_pointerconstraints "github.com/bnema/wlturbo/protocol/pointerconstraints"
79 client_pointerwarp "github.com/bnema/wlturbo/protocol/pointerwarp"
80 client_presentation "github.com/bnema/wlturbo/protocol/presentation"
81 client_primaryselection "github.com/bnema/wlturbo/protocol/primaryselection"
82 client_relativepointer "github.com/bnema/wlturbo/protocol/relativepointer"
83 client_screencopy "github.com/bnema/wlturbo/protocol/screencopy"
84 client_shortcutsinhibit "github.com/bnema/wlturbo/protocol/shortcutsinhibit"
85 client_tearingcontrol "github.com/bnema/wlturbo/protocol/tearingcontrol"
86 client_textinput "github.com/bnema/wlturbo/protocol/textinput"
87 client_viewporter "github.com/bnema/wlturbo/protocol/viewporter"
88 client_virtualkeyboard "github.com/bnema/wlturbo/protocol/virtualkeyboard"
89 client_workspace "github.com/bnema/wlturbo/protocol/workspace"
90 client_xdgactivation "github.com/bnema/wlturbo/protocol/xdgactivation"
91 client_xdgoutput "github.com/bnema/wlturbo/protocol/xdgoutput"
92 client_xdgshell "github.com/bnema/wlturbo/protocol/xdgshell"
93)
94
95type wireSignature interface{ EventSignature(uint16) (string, bool) }
96type wireSchema struct {
97 iface *server.Interface
98 events wireSignature
99 requestDestructors map[uint16]bool
100 eventDestructors map[uint16]bool
101}
102
103var wireSchemas = map[string]wireSchema{
104 "ext_data_control_device_v1": {wire_extdatacontrol.ExtDataControlDeviceV1Interface, &client_datacontrol.ExtDataControlDevice{}, map[uint16]bool{1: true}, nil},
105 "ext_data_control_manager_v1": {wire_extdatacontrol.ExtDataControlManagerV1Interface, &client_datacontrol.ExtDataControlManager{}, map[uint16]bool{2: true}, nil},
106 "ext_data_control_offer_v1": {wire_extdatacontrol.ExtDataControlOfferV1Interface, &client_datacontrol.ExtDataControlOffer{}, map[uint16]bool{1: true}, nil},
107 "ext_data_control_source_v1": {wire_extdatacontrol.ExtDataControlSourceV1Interface, &client_datacontrol.ExtDataControlSource{}, map[uint16]bool{1: true}, nil},
108 "ext_foreign_toplevel_image_capture_source_manager_v1": {wire_extimagecapturesource.ExtForeignToplevelImageCaptureSourceManagerV1Interface, &client_imagecapturesource.ExtForeignToplevelImageCaptureSourceManager{}, map[uint16]bool{1: true}, nil},
109 "ext_idle_notification_v1": {wire_extidlenotify.ExtIdleNotificationV1Interface, &client_idlenotify.ExtIdleNotification{}, map[uint16]bool{0: true}, nil},
110 "ext_idle_notifier_v1": {wire_extidlenotify.ExtIdleNotifierV1Interface, &client_idlenotify.ExtIdleNotifier{}, map[uint16]bool{0: true}, nil},
111 "ext_image_capture_source_v1": {wire_extimagecapturesource.ExtImageCaptureSourceV1Interface, &client_imagecapturesource.ExtImageCaptureSource{}, map[uint16]bool{0: true}, nil},
112 "ext_image_copy_capture_cursor_session_v1": {wire_extimagecopycapture.ExtImageCopyCaptureCursorSessionV1Interface, &client_imagecopycapture.ExtImageCopyCaptureCursorSession{}, map[uint16]bool{0: true}, nil},
113 "ext_image_copy_capture_frame_v1": {wire_extimagecopycapture.ExtImageCopyCaptureFrameV1Interface, &client_imagecopycapture.ExtImageCopyCaptureFrame{}, map[uint16]bool{0: true}, nil},
114 "ext_image_copy_capture_manager_v1": {wire_extimagecopycapture.ExtImageCopyCaptureManagerV1Interface, &client_imagecopycapture.ExtImageCopyCaptureManager{}, map[uint16]bool{2: true}, nil},
115 "ext_image_copy_capture_session_v1": {wire_extimagecopycapture.ExtImageCopyCaptureSessionV1Interface, &client_imagecopycapture.ExtImageCopyCaptureSession{}, map[uint16]bool{1: true}, nil},
116 "ext_output_image_capture_source_manager_v1": {wire_extimagecapturesource.ExtOutputImageCaptureSourceManagerV1Interface, &client_imagecapturesource.ExtOutputImageCaptureSourceManager{}, map[uint16]bool{1: true}, nil},
117 "ext_session_lock_manager_v1": {wire_extsessionlock.ExtSessionLockManagerV1Interface, &client_extsessionlock.ExtSessionLockManager{}, map[uint16]bool{0: true}, nil},
118 "ext_session_lock_surface_v1": {wire_extsessionlock.ExtSessionLockSurfaceV1Interface, &client_extsessionlock.ExtSessionLockSurface{}, map[uint16]bool{0: true}, nil},
119 "ext_session_lock_v1": {wire_extsessionlock.ExtSessionLockV1Interface, &client_extsessionlock.ExtSessionLock{}, map[uint16]bool{0: true, 2: true}, nil},
120 "ext_workspace_group_handle_v1": {wire_extworkspace.ExtWorkspaceGroupHandleV1Interface, &client_workspace.ExtWorkspaceGroupHandle{}, map[uint16]bool{1: true}, nil},
121 "ext_workspace_handle_v1": {wire_extworkspace.ExtWorkspaceHandleV1Interface, &client_workspace.ExtWorkspaceHandle{}, map[uint16]bool{0: true}, nil},
122 "ext_workspace_manager_v1": {wire_extworkspace.ExtWorkspaceManagerV1Interface, &client_workspace.ExtWorkspaceManager{}, nil, map[uint16]bool{3: true}},
123 "neferwl_capture_exclusion_manager_v1": {wire_imagecapture.NeferwlCaptureExclusionManagerV1Interface, nil, map[uint16]bool{0: true}, nil},
124 "neferwl_capture_exclusion_v1": {wire_imagecapture.NeferwlCaptureExclusionV1Interface, nil, map[uint16]bool{0: true}, nil},
125 "neferwl_capture_layer_v1": {wire_imagecapture.NeferwlCaptureLayerV1Interface, nil, map[uint16]bool{0: true}, nil},
126 "neferwl_image_capture_source_manager_v1": {wire_imagecapture.NeferwlImageCaptureSourceManagerV1Interface, nil, map[uint16]bool{0: true}, nil},
127 "neferwl_workspace_frame_v1": {wire_imagecapture.NeferwlWorkspaceFrameV1Interface, nil, map[uint16]bool{0: true}, nil},
128 "org_kde_kwin_server_decoration": {wire_kdedecoration.OrgKdeKwinServerDecorationInterface, &client_kdeserverdecoration.OrgKdeKwinServerDecoration{}, map[uint16]bool{0: true}, nil},
129 "org_kde_kwin_server_decoration_manager": {wire_kdedecoration.OrgKdeKwinServerDecorationManagerInterface, &client_kdeserverdecoration.OrgKdeKwinServerDecorationManager{}, nil, nil},
130 "wl_buffer": {wire_wayland.BufferInterface, &client_core.Buffer{}, map[uint16]bool{0: true}, nil},
131 "wl_callback": {wire_wayland.CallbackInterface, &client_core.Callback{}, nil, map[uint16]bool{0: true}},
132 "wl_compositor": {wire_wayland.CompositorInterface, &client_core.Compositor{}, map[uint16]bool{2: true}, nil},
133 "wl_data_device": {wire_wayland.DataDeviceInterface, &client_core.DataDevice{}, map[uint16]bool{2: true}, nil},
134 "wl_data_device_manager": {wire_wayland.DataDeviceManagerInterface, &client_core.DataDeviceManager{}, map[uint16]bool{2: true}, nil},
135 "wl_data_offer": {wire_wayland.DataOfferInterface, &client_core.DataOffer{}, map[uint16]bool{2: true}, nil},
136 "wl_data_source": {wire_wayland.DataSourceInterface, &client_core.DataSource{}, map[uint16]bool{1: true}, nil},
137 "wl_display": {wire_wayland.DisplayInterface, nil, nil, nil},
138 "wl_fixes": {wire_wayland.FixesInterface, &client_core.Fixes{}, map[uint16]bool{0: true}, nil},
139 "wl_keyboard": {wire_wayland.KeyboardInterface, &client_core.Keyboard{}, map[uint16]bool{0: true}, nil},
140 "wl_output": {wire_wayland.OutputInterface, &client_core.Output{}, map[uint16]bool{0: true}, nil},
141 "wl_pointer": {wire_wayland.PointerInterface, &client_core.Pointer{}, map[uint16]bool{1: true}, nil},
142 "wl_region": {wire_wayland.RegionInterface, &client_core.Region{}, map[uint16]bool{0: true}, nil},
143 "wl_registry": {wire_wayland.RegistryInterface, nil, nil, nil},
144 "wl_seat": {wire_wayland.SeatInterface, &client_core.Seat{}, map[uint16]bool{3: true}, nil},
145 "wl_shell": {wire_wayland.ShellInterface, &client_core.Shell{}, nil, nil},
146 "wl_shell_surface": {wire_wayland.ShellSurfaceInterface, &client_core.ShellSurface{}, nil, nil},
147 "wl_shm": {wire_wayland.ShmInterface, &client_core.Shm{}, map[uint16]bool{1: true}, nil},
148 "wl_shm_pool": {wire_wayland.ShmPoolInterface, &client_core.ShmPool{}, map[uint16]bool{1: true}, nil},
149 "wl_subcompositor": {wire_wayland.SubcompositorInterface, &client_core.Subcompositor{}, map[uint16]bool{0: true}, nil},
150 "wl_subsurface": {wire_wayland.SubsurfaceInterface, &client_core.Subsurface{}, map[uint16]bool{0: true}, nil},
151 "wl_surface": {wire_wayland.SurfaceInterface, &client_core.Surface{}, map[uint16]bool{0: true}, nil},
152 "wl_touch": {wire_wayland.TouchInterface, &client_core.Touch{}, map[uint16]bool{0: true}, nil},
153 "wp_alpha_modifier_surface_v1": {wire_alphamodifier.WpAlphaModifierSurfaceV1Interface, &client_alphamodifier.WpAlphaModifierSurface{}, map[uint16]bool{0: true}, nil},
154 "wp_alpha_modifier_v1": {wire_alphamodifier.WpAlphaModifierV1Interface, &client_alphamodifier.WpAlphaModifier{}, map[uint16]bool{0: true}, nil},
155 "wp_color_management_output_v1": {wire_colormanagement.WpColorManagementOutputV1Interface, &client_colormanagement.WpColorManagementOutput{}, map[uint16]bool{0: true}, nil},
156 "wp_color_management_surface_feedback_v1": {wire_colormanagement.WpColorManagementSurfaceFeedbackV1Interface, &client_colormanagement.WpColorManagementSurfaceFeedback{}, map[uint16]bool{0: true}, nil},
157 "wp_color_management_surface_v1": {wire_colormanagement.WpColorManagementSurfaceV1Interface, &client_colormanagement.WpColorManagementSurface{}, map[uint16]bool{0: true}, nil},
158 "wp_color_manager_v1": {wire_colormanagement.WpColorManagerV1Interface, &client_colormanagement.WpColorManager{}, map[uint16]bool{0: true}, nil},
159 "wp_color_representation_manager_v1": {wire_colorrepresentation.WpColorRepresentationManagerV1Interface, &client_colorrepresentation.WpColorRepresentationManager{}, map[uint16]bool{0: true}, nil},
160 "wp_color_representation_surface_v1": {wire_colorrepresentation.WpColorRepresentationSurfaceV1Interface, &client_colorrepresentation.WpColorRepresentationSurface{}, map[uint16]bool{0: true}, nil},
161 "wp_commit_timer_v1": {wire_committiming.WpCommitTimerV1Interface, &client_committiming.WpCommitTimer{}, map[uint16]bool{1: true}, nil},
162 "wp_commit_timing_manager_v1": {wire_committiming.WpCommitTimingManagerV1Interface, &client_committiming.WpCommitTimingManager{}, map[uint16]bool{0: true}, nil},
163 "wp_cursor_shape_device_v1": {wire_cursorshape.WpCursorShapeDeviceV1Interface, &client_cursorshape.WpCursorShapeDevice{}, map[uint16]bool{0: true}, nil},
164 "wp_cursor_shape_manager_v1": {wire_cursorshape.WpCursorShapeManagerV1Interface, &client_cursorshape.WpCursorShapeManager{}, map[uint16]bool{0: true}, nil},
165 "wp_drm_lease_connector_v1": {wire_drmlease.WpDrmLeaseConnectorV1Interface, &client_drmlease.WpDrmLeaseConnector{}, map[uint16]bool{0: true}, nil},
166 "wp_drm_lease_device_v1": {wire_drmlease.WpDrmLeaseDeviceV1Interface, &client_drmlease.WpDrmLeaseDevice{}, nil, map[uint16]bool{3: true}},
167 "wp_drm_lease_request_v1": {wire_drmlease.WpDrmLeaseRequestV1Interface, &client_drmlease.WpDrmLeaseRequest{}, map[uint16]bool{1: true}, nil},
168 "wp_drm_lease_v1": {wire_drmlease.WpDrmLeaseV1Interface, &client_drmlease.WpDrmLease{}, map[uint16]bool{0: true}, nil},
169 "wp_fifo_manager_v1": {wire_fifo.WpFifoManagerV1Interface, &client_fifo.WpFifoManager{}, map[uint16]bool{0: true}, nil},
170 "wp_fifo_v1": {wire_fifo.WpFifoV1Interface, &client_fifo.WpFifo{}, map[uint16]bool{2: true}, nil},
171 "wp_fractional_scale_manager_v1": {wire_fractionalscale.WpFractionalScaleManagerV1Interface, &client_fractionalscale.WpFractionalScaleManager{}, map[uint16]bool{0: true}, nil},
172 "wp_fractional_scale_v1": {wire_fractionalscale.WpFractionalScaleV1Interface, &client_fractionalscale.WpFractionalScale{}, map[uint16]bool{0: true}, nil},
173 "wp_image_description_creator_icc_v1": {wire_colormanagement.WpImageDescriptionCreatorIccV1Interface, &client_colormanagement.WpImageDescriptionCreatorIcc{}, map[uint16]bool{0: true}, nil},
174 "wp_image_description_creator_params_v1": {wire_colormanagement.WpImageDescriptionCreatorParamsV1Interface, &client_colormanagement.WpImageDescriptionCreatorParams{}, map[uint16]bool{0: true}, nil},
175 "wp_image_description_info_v1": {wire_colormanagement.WpImageDescriptionInfoV1Interface, &client_colormanagement.WpImageDescriptionInfo{}, nil, map[uint16]bool{0: true}},
176 "wp_image_description_reference_v1": {wire_colormanagement.WpImageDescriptionReferenceV1Interface, &client_colormanagement.WpImageDescriptionReference{}, map[uint16]bool{0: true}, nil},
177 "wp_image_description_v1": {wire_colormanagement.WpImageDescriptionV1Interface, &client_colormanagement.WpImageDescription{}, map[uint16]bool{0: true}, nil},
178 "wp_linux_drm_syncobj_manager_v1": {wire_linuxdrmsyncobj.WpLinuxDrmSyncobjManagerV1Interface, &client_drmsyncobj.WpLinuxDrmSyncobjManager{}, map[uint16]bool{0: true}, nil},
179 "wp_linux_drm_syncobj_surface_v1": {wire_linuxdrmsyncobj.WpLinuxDrmSyncobjSurfaceV1Interface, &client_drmsyncobj.WpLinuxDrmSyncobjSurface{}, map[uint16]bool{0: true}, nil},
180 "wp_linux_drm_syncobj_timeline_v1": {wire_linuxdrmsyncobj.WpLinuxDrmSyncobjTimelineV1Interface, &client_drmsyncobj.WpLinuxDrmSyncobjTimeline{}, map[uint16]bool{0: true}, nil},
181 "wp_pointer_warp_v1": {wire_pointerwarp.WpPointerWarpV1Interface, &client_pointerwarp.WpPointerWarp{}, map[uint16]bool{0: true}, nil},
182 "wp_presentation": {wire_presentationtime.WpPresentationInterface, &client_presentation.WpPresentation{}, map[uint16]bool{0: true}, nil},
183 "wp_presentation_feedback": {wire_presentationtime.WpPresentationFeedbackInterface, &client_presentation.WpPresentationFeedback{}, nil, map[uint16]bool{1: true, 2: true}},
184 "wp_security_context_manager_v1": {wire_securitycontext.WpSecurityContextManagerV1Interface, nil, map[uint16]bool{0: true}, nil},
185 "wp_security_context_v1": {wire_securitycontext.WpSecurityContextV1Interface, nil, map[uint16]bool{0: true}, nil},
186 "wp_tearing_control_manager_v1": {wire_tearingcontrol.WpTearingControlManagerV1Interface, &client_tearingcontrol.WpTearingControlManager{}, map[uint16]bool{0: true}, nil},
187 "wp_tearing_control_v1": {wire_tearingcontrol.WpTearingControlV1Interface, &client_tearingcontrol.WpTearingControl{}, map[uint16]bool{1: true}, nil},
188 "wp_viewport": {wire_viewporter.WpViewportInterface, &client_viewporter.WpViewport{}, map[uint16]bool{0: true}, nil},
189 "wp_viewporter": {wire_viewporter.WpViewporterInterface, &client_viewporter.WpViewporter{}, map[uint16]bool{0: true}, nil},
190 "xdg_activation_token_v1": {wire_xdgactivation.ActivationTokenV1Interface, &client_xdgactivation.XdgActivationToken{}, map[uint16]bool{4: true}, nil},
191 "xdg_activation_v1": {wire_xdgactivation.ActivationV1Interface, &client_xdgactivation.XdgActivation{}, map[uint16]bool{0: true}, nil},
192 "xdg_popup": {wire_xdgshell.PopupInterface, &client_xdgshell.XdgPopup{}, map[uint16]bool{0: true}, nil},
193 "xdg_positioner": {wire_xdgshell.PositionerInterface, &client_xdgshell.XdgPositioner{}, map[uint16]bool{0: true}, nil},
194 "xdg_surface": {wire_xdgshell.SurfaceInterface, &client_xdgshell.XdgSurface{}, map[uint16]bool{0: true}, nil},
195 "xdg_toplevel": {wire_xdgshell.ToplevelInterface, &client_xdgshell.XdgToplevel{}, map[uint16]bool{0: true}, nil},
196 "xdg_wm_base": {wire_xdgshell.WmBaseInterface, &client_xdgshell.XdgWmBase{}, map[uint16]bool{0: true}, nil},
197 "zwlr_foreign_toplevel_handle_v1": {wire_wlrforeigntoplevel.ZwlrForeignToplevelHandleV1Interface, &client_foreigntoplevel.ForeignToplevelHandle{}, map[uint16]bool{7: true}, nil},
198 "zwlr_foreign_toplevel_manager_v1": {wire_wlrforeigntoplevel.ZwlrForeignToplevelManagerV1Interface, &client_foreigntoplevel.ForeignToplevelManager{}, nil, map[uint16]bool{1: true}},
199 "zwlr_layer_shell_v1": {wire_wlrlayershell.ZwlrLayerShellV1Interface, &client_layershell.LayerShell{}, map[uint16]bool{1: true}, nil},
200 "zwlr_layer_surface_v1": {wire_wlrlayershell.ZwlrLayerSurfaceV1Interface, &client_layershell.LayerSurface{}, map[uint16]bool{7: true}, nil},
201 "zwlr_output_configuration_head_v1": {wire_wlroutputmanagement.ZwlrOutputConfigurationHeadV1Interface, &client_outputmanagement.OutputConfigurationHead{}, nil, nil},
202 "zwlr_output_configuration_v1": {wire_wlroutputmanagement.ZwlrOutputConfigurationV1Interface, &client_outputmanagement.OutputConfiguration{}, map[uint16]bool{4: true}, nil},
203 "zwlr_output_head_v1": {wire_wlroutputmanagement.ZwlrOutputHeadV1Interface, &client_outputmanagement.OutputHead{}, map[uint16]bool{0: true}, nil},
204 "zwlr_output_manager_v1": {wire_wlroutputmanagement.ZwlrOutputManagerV1Interface, &client_outputmanagement.OutputManager{}, nil, map[uint16]bool{2: true}},
205 "zwlr_output_mode_v1": {wire_wlroutputmanagement.ZwlrOutputModeV1Interface, &client_outputmanagement.OutputMode{}, map[uint16]bool{0: true}, nil},
206 "zwlr_output_power_manager_v1": {wire_wlroutputpower.ZwlrOutputPowerManagerV1Interface, &client_outputpower.OutputPowerManager{}, map[uint16]bool{1: true}, nil},
207 "zwlr_output_power_v1": {wire_wlroutputpower.ZwlrOutputPowerV1Interface, &client_outputpower.OutputPower{}, map[uint16]bool{1: true}, nil},
208 "zwlr_screencopy_frame_v1": {wire_wlrscreencopy.ZwlrScreencopyFrameV1Interface, &client_screencopy.ScreencopyFrame{}, map[uint16]bool{1: true}, nil},
209 "zwlr_screencopy_manager_v1": {wire_wlrscreencopy.ZwlrScreencopyManagerV1Interface, &client_screencopy.ScreencopyManager{}, map[uint16]bool{2: true}, nil},
210 "zwp_confined_pointer_v1": {wire_pointerconstraints.ZwpConfinedPointerV1Interface, &client_pointerconstraints.ConfinedPointer{}, map[uint16]bool{0: true}, nil},
211 "zwp_idle_inhibit_manager_v1": {wire_idleinhibit.ZwpIdleInhibitManagerV1Interface, &client_idleinhibit.IdleInhibitManager{}, map[uint16]bool{0: true}, nil},
212 "zwp_idle_inhibitor_v1": {wire_idleinhibit.ZwpIdleInhibitorV1Interface, &client_idleinhibit.IdleInhibitor{}, map[uint16]bool{0: true}, nil},
213 "zwp_input_method_keyboard_grab_v2": {wire_inputmethod.ZwpInputMethodKeyboardGrabV2Interface, &client_inputmethod.InputMethodKeyboardGrab{}, map[uint16]bool{0: true}, nil},
214 "zwp_input_method_manager_v2": {wire_inputmethod.ZwpInputMethodManagerV2Interface, &client_inputmethod.InputMethodManager{}, map[uint16]bool{1: true}, nil},
215 "zwp_input_method_v2": {wire_inputmethod.ZwpInputMethodV2Interface, &client_inputmethod.InputMethod{}, map[uint16]bool{6: true}, nil},
216 "zwp_input_popup_surface_v2": {wire_inputmethod.ZwpInputPopupSurfaceV2Interface, &client_inputmethod.InputPopupSurface{}, map[uint16]bool{0: true}, nil},
217 "zwp_keyboard_shortcuts_inhibit_manager_v1": {wire_keyboardshortcutsinhibit.ZwpKeyboardShortcutsInhibitManagerV1Interface, &client_shortcutsinhibit.KeyboardShortcutsInhibitManager{}, map[uint16]bool{0: true}, nil},
218 "zwp_keyboard_shortcuts_inhibitor_v1": {wire_keyboardshortcutsinhibit.ZwpKeyboardShortcutsInhibitorV1Interface, &client_shortcutsinhibit.KeyboardShortcutsInhibitor{}, map[uint16]bool{0: true}, nil},
219 "zwp_linux_buffer_params_v1": {wire_linuxdmabuf.ZwpLinuxBufferParamsV1Interface, &client_linuxdmabuf.LinuxBufferParams{}, map[uint16]bool{0: true}, nil},
220 "zwp_linux_dmabuf_feedback_v1": {wire_linuxdmabuf.ZwpLinuxDmabufFeedbackV1Interface, &client_linuxdmabuf.LinuxDmabufFeedback{}, map[uint16]bool{0: true}, nil},
221 "zwp_linux_dmabuf_v1": {wire_linuxdmabuf.ZwpLinuxDmabufV1Interface, &client_linuxdmabuf.LinuxDmabuf{}, map[uint16]bool{0: true}, nil},
222 "zwp_locked_pointer_v1": {wire_pointerconstraints.ZwpLockedPointerV1Interface, &client_pointerconstraints.LockedPointer{}, map[uint16]bool{0: true}, nil},
223 "zwp_pointer_constraints_v1": {wire_pointerconstraints.ZwpPointerConstraintsV1Interface, &client_pointerconstraints.PointerConstraints{}, map[uint16]bool{0: true}, nil},
224 "zwp_primary_selection_device_manager_v1": {wire_primaryselection.ZwpPrimarySelectionDeviceManagerV1Interface, &client_primaryselection.PrimarySelectionDeviceManager{}, map[uint16]bool{2: true}, nil},
225 "zwp_primary_selection_device_v1": {wire_primaryselection.ZwpPrimarySelectionDeviceV1Interface, &client_primaryselection.PrimarySelectionDevice{}, map[uint16]bool{1: true}, nil},
226 "zwp_primary_selection_offer_v1": {wire_primaryselection.ZwpPrimarySelectionOfferV1Interface, &client_primaryselection.PrimarySelectionOffer{}, map[uint16]bool{1: true}, nil},
227 "zwp_primary_selection_source_v1": {wire_primaryselection.ZwpPrimarySelectionSourceV1Interface, &client_primaryselection.PrimarySelectionSource{}, map[uint16]bool{1: true}, nil},
228 "zwp_relative_pointer_manager_v1": {wire_relativepointer.ZwpRelativePointerManagerV1Interface, &client_relativepointer.RelativePointerManager{}, map[uint16]bool{0: true}, nil},
229 "zwp_relative_pointer_v1": {wire_relativepointer.ZwpRelativePointerV1Interface, &client_relativepointer.RelativePointer{}, map[uint16]bool{0: true}, nil},
230 "zwp_text_input_manager_v3": {wire_textinput.ZwpTextInputManagerV3Interface, &client_textinput.TextInputManagerV3{}, map[uint16]bool{0: true}, nil},
231 "zwp_text_input_v3": {wire_textinput.ZwpTextInputV3Interface, &client_textinput.TextInputV3{}, map[uint16]bool{0: true}, nil},
232 "zwp_virtual_keyboard_manager_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardManagerV1Interface, &client_virtualkeyboard.VirtualKeyboardManager{}, nil, nil},
233 "zwp_virtual_keyboard_v1": {wire_virtualkeyboard.ZwpVirtualKeyboardV1Interface, &client_virtualkeyboard.VirtualKeyboard{}, map[uint16]bool{3: true}, nil},
234 "zxdg_output_manager_v1": {wire_xdgoutput.ZxdgOutputManagerV1Interface, &client_xdgoutput.ZxdgOutputManager{}, map[uint16]bool{0: true}, nil},
235 "zxdg_output_v1": {wire_xdgoutput.ZxdgOutputV1Interface, &client_xdgoutput.ZxdgOutput{}, map[uint16]bool{0: true}, nil},
236}
237
238type wireObjectKey struct {
239 c *wlturbo.Display
240 id uint32
241}
242
243var wireObjects sync.Map // wireObjectKey -> *wireReceiver; display cleanup removes all entries
244
245// wireReceiver is a real wire event receiver, not a replacement project service.
246// It can keep a quiet receiver until a test installs its observer at the same ID.
247type wireReceiver struct {
248 wlturbo.BaseProxy
249 c *wlturbo.Display
250 schema wireSchema
251 observer wlturbo.Proxy
252}
253
254func (p *wireReceiver) EventSignature(op uint16) (string, bool) {
255 if p.schema.events != nil {
256 return p.schema.events.EventSignature(op)
257 }
258 if p.schema.iface == nil || int(op) >= len(p.schema.iface.Events) {
259 return "", false
260 }
261 return wireSignatureText(p.schema.iface.Events[op].Signature), true
262}
263func wireSignatureText(sig string) string {
264 var b strings.Builder
265 for _, ch := range sig {
266 switch ch {
267 case 'i':
268 b.WriteString("int,")
269 case 'u':
270 b.WriteString("uint,")
271 case 'f':
272 b.WriteString("fixed,")
273 case 's':
274 b.WriteString("string,")
275 case 'o':
276 b.WriteString("object,")
277 case 'n':
278 b.WriteString("new_id,")
279 case 'a':
280 b.WriteString("array,")
281 case 'h':
282 b.WriteString("fd,")
283 }
284 }
285 return b.String()
286}
287func (p *wireReceiver) Dispatch(e *wlturbo.Event) {
288 // Server-created objects must exist before an observer reads their events.
289 if p.schema.iface != nil && int(e.Opcode) < len(p.schema.iface.Events) {
290 m := p.schema.iface.Events[e.Opcode]
291 // A separate cursor preserves the observer's event offset and FD ownership.
292 pos := 0
293 arg := 0
294 for _, ch := range m.Signature {
295 if ch == '?' || ch >= '0' && ch <= '9' {
296 continue
297 }
298 if ch == 'n' && arg < len(m.Types) && m.Types[arg] != nil && pos+4 <= len(e.Data()) {
299 id := binary.NativeEndian.Uint32(e.Data()[pos:])
300 setWireSchema(p.c, id, m.Types[arg].Name, p.Version())
301 }
302 switch ch {
303 case 'h':
304 case 's', 'a':
305 if pos+4 <= len(e.Data()) {
306 n := int(binary.NativeEndian.Uint32(e.Data()[pos:]))
307 pos += 4 + (n+3)&^3
308 }
309 default:
310 pos += 4
311 }
312 arg++
313 }
314 }
315 if p.observer != nil {
316 p.observer.Dispatch(e)
317 }
318 if p.schema.eventDestructors[e.Opcode] {
319 p.c.Context().Unregister(p)
320 wireObjects.Delete(wireObjectKey{p.c, p.ID()})
321 }
322}
323func wireObject(c *wlturbo.Display, id uint32) *wireReceiver {
324 k := wireObjectKey{c, id}
325 if v, ok := wireObjects.Load(k); ok {
326 return v.(*wireReceiver)
327 }
328 p := &wireReceiver{c: c}
329 p.SetID(id)
330 p.SetContext(c.Context())
331 actual, _ := wireObjects.LoadOrStore(k, p)
332 return actual.(*wireReceiver)
333}
334func registerWireProxy(c *wlturbo.Display, observer wlturbo.Proxy) {
335 p := wireObject(c, observer.ID())
336 if setter, ok := observer.(interface{ SetContext(*wlturbo.Context) }); ok {
337 setter.SetContext(c.Context())
338 }
339 p.observer = observer
340 c.Context().Register(p)
341}
342func setWireSchema(c *wlturbo.Display, id uint32, iface string, version uint32) {
343 schema, ok := wireSchemas[iface]
344 if !ok {
345 panic("missing raw-wire test schema: " + iface)
346 }
347 p := wireObject(c, id)
348 p.schema = schema
349 p.SetVersion(version)
350 if setter, ok := p.observer.(interface{ SetVersion(uint32) }); ok {
351 setter.SetVersion(version)
352 }
353 c.Context().Register(p)
354}
355func bindWireID(c *wlturbo.Display, name uint32, iface string, version uint32) (uint32, error) {
356 id, err := c.Registry().BindID(name, iface, version)
357 if err == nil {
358 setWireSchema(c, id, iface, version)
359 }
360 return id, err
361}
362func wireRequest(c *wlturbo.Display, id uint32, op uint16, fds []int, args ...any) error {
363 v, ok := wireObjects.Load(wireObjectKey{c, id})
364 if !ok {
365 return c.SendRequestWithFDs(id, op, fds, args...)
366 } // intentional nonexistent target
367 p := v.(*wireReceiver)
368 if p.schema.iface != nil && int(op) < len(p.schema.iface.Requests) {
369 m := p.schema.iface.Requests[op]
370 arg, typeIndex := 0, 0
371 for _, ch := range m.Signature {
372 if ch == '?' || ch >= '0' && ch <= '9' {
373 continue
374 }
375 // Raw Display.SendRequestWithFDs omits FD placeholders from args.
376 if ch == 'h' {
377 typeIndex++
378 continue
379 }
380 if ch == 'n' && typeIndex < len(m.Types) && m.Types[typeIndex] != nil && arg < len(args) {
381 if child, ok := args[arg].(uint32); ok && child != 0 {
382 setWireSchema(c, child, m.Types[typeIndex].Name, p.Version())
383 }
384 }
385 arg++
386 typeIndex++
387 }
388 if p.schema.requestDestructors[op] {
389 err := c.Context().SendDestructorWithFDs(p, uint32(op), fds, args...)
390 if err == nil {
391 wireObjects.Delete(wireObjectKey{c, id})
392 }
393 return err
394 }
395 }
396 return c.SendRequestWithFDs(id, op, fds, args...)
397}
398func forgetWireClient(c *wlturbo.Display) {
399 wireObjects.Range(func(k, v any) bool {
400 if k.(wireObjectKey).c == c {
401 wireObjects.Delete(k)
402 }
403 return true
404 })
405}
406
407// retireWireObject handles protocol-defined destruction caused by another
408// object (for example configuration heads). No request is sent on the child.
409func retireWireObject(c *wlturbo.Display, id uint32) {
410 if v, ok := wireObjects.LoadAndDelete(wireObjectKey{c, id}); ok {
411 c.Context().Unregister(v.(*wireReceiver))
412 }
413}
414
415// Catch drift between the generated server descriptions used for new_id
416// bookkeeping and the canonical generated client schemas used by dispatch.
417func TestRawWireSchemasMatchGeneratedProtocols(t *testing.T) {
418 for name, schema := range wireSchemas {
419 t.Run(name, func(t *testing.T) {
420 if schema.events != nil {
421 for op, event := range schema.iface.Events {
422 got, ok := schema.events.EventSignature(uint16(op))
423 if !ok || got != wireSignatureText(event.Signature) {
424 t.Fatalf("event %s schema=%q supported=%t want=%q", event.Name, got, ok, wireSignatureText(event.Signature))
425 }
426 }
427 }
428 for op := range schema.requestDestructors {
429 if int(op) >= len(schema.iface.Requests) {
430 t.Fatalf("destructor %d outside %s", op, name)
431 }
432 }
433 for op := range schema.eventDestructors {
434 if int(op) >= len(schema.iface.Events) {
435 t.Fatalf("event destructor %d outside %s", op, name)
436 }
437 }
438 })
439 }
440}