main f2d166b

wire_client_test.go RawHistoryFolder

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

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 25

Tags 10

↑↓ moveenter openesc close