File: types.go

package info (click to toggle)
golang-github-joshuarubin-go-sway 1.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 124 kB
  • sloc: makefile: 3
file content (731 lines) | stat: -rw-r--r-- 27,165 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
package sway

import "encoding/json"

type Rect struct {
	X      int64 `json:"x,omitempty"`
	Y      int64 `json:"y,omitempty"`
	Width  int64 `json:"width,omitempty"`
	Height int64 `json:"height,omitempty"`
}

type WindowProperties struct {
	Title        string `json:"title,omitempty"`
	Class        string `json:"class,omitempty"`
	Instance     string `json:"instance,omitempty"`
	Role         string `json:"window_role,omitempty"`
	Type         string `json:"window_type,omitempty"`
	TransientFor *int64 `json:"transient_for,omitempty"`
}

type IdleInhibitors struct {
	Application string `json:"application,omitempty"`
	User        string `json:"user,omitempty"`
}

// Node types
type NodeType string

const (
	NodeRoot        NodeType = "root"
	NodeOutput      NodeType = "output"
	NodeWorkspace   NodeType = "workspace"
	NodeCon         NodeType = "con"
	NodeFloatingCon NodeType = "floating_con"
)

// Node layouts
type Layout string

const (
	LayoutOutput  Layout = "output"
	LayoutSplitH  Layout = "splith"
	LayoutSplitV  Layout = "splitv"
	LayoutStacked Layout = "stacked"
	LayoutTabbed  Layout = "tabbed"
)

// Border types
type Border string

const (
	BorderNormal Border = "normal"
	BorderNone   Border = "none"
	BorderPixel  Border = "pixel"
	BorderCsd    Border = "csd"
)

// Fullscreen modes
type FullscreenMode int

const (
	FullscreenNone   FullscreenMode = 0
	FullscreenOutput FullscreenMode = 1
	FullscreenGlobal FullscreenMode = 2
)

// workspace event types
type WorkspaceEventChange string

const (
	// The workspace is empty and is being destroyed since it is not visible
	WorkspaceEmpty WorkspaceEventChange = "empty"
	// The workspace was created
	WorkspaceInit WorkspaceEventChange = "init"
	// The workspace was focused. See the old property for the previous focus
	WorkspaceFocus WorkspaceEventChange = "focus"
	// The workspace was moved to a different output
	WorkspaceMove WorkspaceEventChange = "move"
	//  The configuration file has been reloaded
	WorkspaceReload WorkspaceEventChange = "reload"
	// The workspace was renamed
	WorkspaceRename WorkspaceEventChange = "rename"
	//  A view on the workspace has had their urgency hint set or all hints for views on the workspace have been cleared
	WorkspaceUrgent WorkspaceEventChange = "urgent"
)

// window event types
type WindowEventChange string

const (
	// The view was closed
	WindowClose WindowEventChange = "close"
	// The view has become floating or is no longer floating
	WindowFloating WindowEventChange = "floating"
	// The view was focused
	WindowFocus WindowEventChange = "focus"
	// The view's fullscreen mode has changed
	WindowFullscreen WindowEventChange = "fullscreen_mode"
	// A mark has been added or removed from the view
	WindowMark WindowEventChange = "mark"
	// The view has been reparented in the tree
	WindowMove WindowEventChange = "move"
	// The view was created
	WindowNew WindowEventChange = "new"
	// The view's title has changed
	WindowTitle WindowEventChange = "title"
	// The view's urgency hint has changed status
	WindowUrgent WindowEventChange = "urgent"
)

type Node struct {
	// The internal unique ID for this node
	ID                 int64             `json:"id,omitempty"`

	// The name of the node such as the output name or window title.
	// For the scratchpad, this will be "__i3_scratch" for compatibility with i3.
	Name               string            `json:"name,omitempty"`

	// The node type.
	// It can be "root", "output", "workspace", "con", or "floating_con"
	Type NodeType `json:"type,omitempty"`

	// The border style for the node.
	// It can be "normal", "none", "pixel", or "csd"
	Border Border `json:"border,omitempty"`

	// Number of pixels used for the border width
	CurrentBorderWidth int64             `json:"current_border_width,omitempty"`

	// The node's layout.
	// It can either be "splith", "splitv", "stacked", "tabbed", or "output"
	Layout Layout `json:"layout,omitempty"`

	// The node's orientation.
	// It can be "vertical", "horizontal", or "none"
	Orientation        string            `json:"orientation,omitempty"`

	// The percentage of the node's parent that it takes up or null for the root
	// and other special nodes such as the scratchpad
	Percent            *float64          `json:"percent,omitempty"`

	// The absolute geometry of the node. The window decorations are excluded
	// from this, but borders are included.
	Rect               Rect              `json:"rect,omitempty"`

	// The geometry of the contents inside the node. The window decorations are
	// excluded from this calculation, but borders are included.
	WindowRect         Rect              `json:"window_rect,omitempty"`

	// The geometry of the decorations for the node relative to the parent node
	DecoRect           Rect              `json:"deco_rect,omitempty"`

	// The natural geometry of the contents if it were to size itself
	Geometry           Rect              `json:"geometry,omitempty"`

	// Whether the node or any of its descendants has the urgent hint set.
	// Note: This may not exist when compiled without xwayland support
	Urgent             *bool             `json:"urgent,omitempty"`

	// Whether the node is sticky (shows on all workspaces)
	Sticky             bool              `json:"sticky,omitempty"`

	// List of marks assigned to the node
	Marks []string `json:"marks,omitempty"`

	// Whether the node is currently focused by the default seat (seat0)
	Focused            bool              `json:"focused,omitempty"`

	// Array of child node IDs in the current focus order
	Focus              []int64           `json:"focus,omitempty"`

	// The tiling children nodes for the node
	Nodes              []*Node           `json:"nodes,omitempty"`

	// The floating children nodes for the node
	FloatingNodes      []*Node           `json:"floating_nodes,omitempty"`

	// (Only workspaces) A string representation of the layout of the workspace
	// that can be used as an aid in submitting reproduction steps for bug reports
	Representation     *string           `json:"representation,omitempty"`

	// (Only containers and views) The fullscreen mode of the node.
	// 0 means none, 1 means full output, and 2 means global fullscreen
	FullscreenMode FullscreenMode `json:"fullscreen_mode,omitempty"`

	// (Only views) For an xdg-shell view, the name of the application, if set.
	// Otherwise, null
	AppID              *string           `json:"app_id,omitempty"`

	// (Only views) The PID of the application that owns the view
	PID                *uint32           `json:"pid,omitempty"`

	// (Only views) Whether the node is visible
	Visible            *bool             `json:"visible,omitempty"`

	// (Only views) The shell of the view, such as "xdg_shell" or "xwayland"
	Shell              *string           `json:"shell,omitempty"`

	// (Only views) Whether the view is inhibiting the idle state
	InhibitIdle        *bool             `json:"inhibit_idle,omitempty"`

	// (Only views) An object containing the state of the application and user
	// idle inhibitors. "application" can be "enabled" or "none".
	// "user" can be "focus", "fullscreen", "open", "visible" or "none".
	IdleInhibitors IdleInhibitors `json:"idle_inhibitors,omitempty"`

	// (Only xwayland views) The X11 window ID for the xwayland view
	Window             *int64            `json:"window,omitempty"`

	// (Only xwayland views) An object containing the "title", "class", "instance",
	// "window_role", "window_type", and "transient_for" for the view
	WindowProperties   *WindowProperties `json:"window_properties,omitempty"`
}

// FocusedNode traverses the node tree and returns the focused node
func (n *Node) FocusedNode() *Node {
	focusedNode := n.TraverseNodes(func(n *Node) bool {
		return n.Focused
	})
	return focusedNode
}

// TraverseNodes returns the first Node matching the predicate
func (n *Node) TraverseNodes(predicate func(*Node) bool) *Node {
	queue := []*Node{n}
	for len(queue) > 0 {
		n = queue[0]
		queue = queue[1:]

		if n == nil {
			continue
		}

		if predicate(n) {
			return n
		}

		queue = append(queue, n.Nodes...)
		queue = append(queue, n.FloatingNodes...)
	}
	return nil
}

// WorkspaceEvent is sent whenever a change involving a workspace occurs
type WorkspaceEvent struct {
	// The type of change that occurred
	// The following change types are currently available:
	// init:   the workspace was created
	// empty:  the workspace is empty and is being destroyed since it is not
	//         visible
	// focus:  the workspace was focused. See the old property for the previous
	//         focus
	// move:   the workspace was moved to a different output
	// rename: the workspace was renamed
	// urgent: a view on the workspace has had their urgency hint set or all
	//         urgency hints for views on the workspace have been cleared
	// reload: The configuration file has been reloaded
	Change WorkspaceEventChange `json:"change,omitempty"`

	// An object representing the workspace effected or null for "reload" changes
	Current *Node `json:"current,omitempty"`

	// For a "focus" change, this is will be an object representing the workspace
	// being switched from. Otherwise, it is null
	Old *Node `json:"old,omitempty"`
}

// WindowEvent is sent whenever a change involving a view occurs
type WindowEvent struct {
	// The type of change that occurred
	//
	// The following change types are currently available:
	// new:             The view was created
	// close:           The view was closed
	// focus:           The view was focused
	// title:           The view's title has changed
	// fullscreen_mode: The view's fullscreen mode has changed
	// move:            The view has been reparented in the tree
	// floating:        The view has become floating or is no longer floating
	// urgent:          The view's urgency hint has changed status
	// mark:            A mark has been added or removed from the view
	Change WindowEventChange `json:"change,omitempty"`

	// An object representing the view effected
	Container Node `json:"container,omitempty"`
}

// ShutdownEvent is sent whenever the IPC is shutting down
type ShutdownEvent struct {
	// A string containing the reason for the shutdown.  Currently, the only
	// value for change is "exit", which is issued when sway is exiting.
	Change string `json:"change,omitempty"`
}

type RunCommandReply struct {
	Success bool   `json:"success,omitempty"`
	Error   string `json:"error,omitempty"`
}

type Workspace struct {
	// The workspace number or -1 for workspaces that do not start with a number
	Num     int64  `json:"num,omitempty"`

	// The name of the workspace
	Name    string `json:"name,omitempty"`

	// Whether the workspace is currently visible on any output
	Visible bool   `json:"visible,omitempty"`

	// Whether the workspace is currently focused by the default seat (seat0)
	Focused bool   `json:"focused,omitempty"`

	// Whether a view on the workspace has the urgent flag set
	Urgent  bool   `json:"urgent,omitempty"`

	// The bounds of the workspace. It consists of x, y, width, and height
	Rect    Rect   `json:"rect,omitempty"`

	// The name of the output that the workspace is on
	Output  string `json:"output,omitempty"`
}

type Refresh float64

func (r *Refresh) UnmarshalJSON(raw []byte) error {
	var n int64
	if err := json.Unmarshal(raw, &n); err != nil {
		return err
	}
	*r = Refresh(float64(n) / 1000)
	return nil
}

type OutputMode struct {
	Width   int64   `json:"width,omitempty"`
	Height  int64   `json:"height,omitempty"`
	Refresh Refresh `json:"refresh,omitempty"`
}

type Output struct {
	// The name of the output. On DRM, this is the connector
	Name             string       `json:"name,omitempty"`

	// The make of the output
	Make             string       `json:"make,omitempty"`

	// The model of the output
	Model            string       `json:"model,omitempty"`

	// The output's serial number as a hexadecimal string
	Serial           string       `json:"serial,omitempty"`

	// Whether this output is active/enabled
	Active           bool         `json:"active,omitempty"`

	// Whether this output is on/off (via DPMS)
	DPMS             bool         `json:"dpms,omitempty"`

	// For i3 compatibility, this will be false. It does not make sense in Wayland
	Primary          bool         `json:"primary,omitempty"`

	// The scale currently in use on the output or -1 for disabled outputs
	Scale            float64      `json:"scale,omitempty"`

	// The subpixel hinting current in use on the output.
	// This can be "rgb", "bgr", "vrgb", "vbgr", or "none"
	SubpixelHinting  string       `json:"subpixel_hinting,omitempty"`

	// The transform currently in use for the output. This can be "normal", "90",
	// "180", "270", "flipped-90", "flipped-180", or "flipped-270"
	Transform        string       `json:"transform,omitempty"`

	// The workspace currently visible on the output or null for disabled outputs
	CurrentWorkspace string       `json:"current_workspace,omitempty"`

	// An array of supported mode objects.
	// Each object contains "width", "height", and "refresh"
	Modes            []OutputMode `json:"modes,omitempty"`

	// An object representing the current mode containing "width", "height", and "refresh"
	CurrentMode      OutputMode   `json:"current_mode,omitempty"`

	// The bounds for the output consisting of "x", "y", "width", and "height"
	Rect             Rect         `json:"rect,omitempty"`
}

type BarConfigGaps struct {
	Top    int64 `json:"top,omitempty"`
	Right  int64 `json:"right,omitempty"`
	Bottom int64 `json:"bottom,omitempty"`
	Left   int64 `json:"left,omitempty"`
}

// The colors object contains strings which are all #RRGGBBAA representation
// of the color
type BarConfigColors struct {
	// The color to use for the bar background on unfocused outputs
	Background              string `json:"background,omitempty"`

	// The color to use for the status line text on unfocused outputs
	Statusline              string `json:"statusline,omitempty"`

	// 	The color to use for the separator text on unfocused outputs
	Separator               string `json:"separator,omitempty"`

	// The color to use for the background of the bar on the focused output
	FocusedBackground       string `json:"focused_background,omitempty"`

	// The color to use for the status line text on the focused output
	FocusedStatusline       string `json:"focused_statusline,omitempty"`

	// The color to use for the separator text on the focused output
	FocusedSeparator        string `json:"focused_separator,omitempty"`

	// The color to use for the text of the focused workspace button
	FocusedWorkspaceText    string `json:"focused_workspace_text,omitempty"`

	// The color to use for the background of the focused workspace button
	FocusedWorkspaceBG      string `json:"focused_workspace_bg,omitempty"`

	// The color to use for the border of the focused workspace button
	FocusedWorkspaceBorder  string `json:"focused_workspace_border,omitempty"`

	// The color to use for the text of the workspace buttons for the visible
	// workspaces on unfocused outputs
	ActiveWorkspaceText     string `json:"active_workspace_text,omitempty"`

	// The color to use for the background of the workspace buttons for the
	// visible workspaces on unfocused outputs
	ActiveWorkspaceBG       string `json:"active_workspace_bg,omitempty"`

	// The color to use for the border of the workspace buttons for the visible
	// workspaces on unfocused outputs
	ActiveWorkspaceBorder   string `json:"active_workspace_border,omitempty"`

	// The color to use for the text of the workspace buttons for workspaces
	// that are not visible
	InactiveWorkspaceText   string `json:"inactive_workspace_text,omitempty"`

	// The color to use for the background of the workspace buttons for workspaces
	// that are not visible
	InactiveWorkspaceBG     string `json:"inactive_workspace_bg,omitempty"`

	// The color to use for the border of the workspace buttons for workspaces
	// that are not visible
	InactiveWorkspaceBorder string `json:"inactive_workspace_border,omitempty"`

	// The color to use for the text of the workspace buttons for workspaces
	// that contain an urgent view
	UrgentWorkspaceText     string `json:"urgent_workspace_text,omitempty"`

	// The color to use for the background of the workspace buttons for workspaces
	// that contain an urgent view
	UrgentWorkspaceBG       string `json:"urgent_workspace_bg,omitempty"`

	// The color to use for the border of the workspace buttons for workspaces
	// that contain an urgent view
	UrgentWorkspaceBorder   string `json:"urgent_workspace_border,omitempty"`

	// The color to use for the text of the binding mode indicator
	BindingModeText         string `json:"binding_mode_text,omitempty"`

	// The color to use for the background of the binding mode indicator
	BindingModeBG           string `json:"binding_mode_bg,omitempty"`

	// The color to use for the border of the binding mode indicator
	BindingModeBorder       string `json:"binding_mode_border,omitempty"`
}

// BarConfigUpdateEvent is sent whenever a config for a bar changes. The event
// is identical to that of GET_BAR_CONFIG when a bar ID is given as a payload.
type BarConfigUpdateEvent = BarConfig

// Represents the configuration for the bar with the bar ID sent as the payload
type BarConfig struct {
	// The bar ID
	ID                   string          `json:"id,omitempty"`

	// The mode for the bar. It can be "dock", "hide", or "invisible"
	Mode                 string          `json:"mode,omitempty"`

	// The bar's position. It can currently either be "bottom" or "top"
	Position             string          `json:"position,omitempty"`

	// The command which should be run to generate the status line
	StatusCommand        string          `json:"status_command,omitempty"`

	// The font to use for the text on the bar
	Font                 string          `json:"font,omitempty"`

	// Whether to display the workspace buttons on the bar
	WorkspaceButtons     bool            `json:"workspace_buttons,omitempty"`

	// Minimum width in px for the workspace buttons on the bar
	WorkspaceMinWidth    int64           `json:"workspace_min_width,omitempty"`

	// Whether to display the current binding mode on the bar
	BindingModeIndicator bool            `json:"binding_mode_indicator,omitempty"`

	// For i3 compatibility, this will be the boolean value "false".
	Verbose              bool            `json:"verbose,omitempty"`

	// An object containing the #RRGGBBAA colors to use for the bar.
	Colors               BarConfigColors `json:"colors,omitempty"`

	// An object representing the gaps for the bar consisting of "top", "right",
	// "bottom", and "left".
	Gaps                 BarConfigGaps   `json:"gaps,omitempty"`

	// The absolute height to use for the bar or 0 to automatically size based on
	// the font
	BarHeight            int64           `json:"bar_height,omitempty"`

	// The vertical padding to use for the status line
	StatusPadding        int64           `json:"status_padding,omitempty"`

	// The horizontal padding to use for the status line when at the end of an output
	StatusEdgePadding    int64           `json:"status_edge_padding,omitempty"`
}

// Contains version information about the sway process
type Version struct {
	// The major version of the sway process
	Major                int64  `json:"major,omitempty"`

	// The minor version of the sway process
	Minor                int64  `json:"minor,omitempty"`

	// The patch version of the sway process
	Patch                int64  `json:"patch,omitempty"`

	// A human readable version string that will likely contain more useful
	// information such as the git commit short hash and git branch
	HumanReadable        string `json:"human_readable,omitempty"`

	// The path to the loaded config file
	LoadedConfigFileName string `json:"loaded_config_file_name,omitempty"`
}

type Config struct {
	Config string `json:"config,omitempty"`
}

type TickReply struct {
	Success bool `json:"success,omitempty"`
}

// The libinput object describes the device configuration for libinput devices.
// Only properties that are supported for the device will be added to the object.
// In addition to the possible options listed, all string properties may also
// be unknown, in the case that a new option is added to libinput.
// See sway-input(5) for information on the meaning of the possible values.
type LibInput struct {
	// Whether events are being sent by the device.
	// It can be "enabled", "disabled", or "disabled_on_external_mouse"
	SendEvents        string     `json:"send_events,omitempty"`

	// Whether tap to click is enabled. It can be "enabled" or "disabled"
	Tap               string     `json:"tap,omitempty"`

	// The finger to button mapping in use. It can be "lmr" or "lrm"
	TapButtonMap      string     `json:"tap_button_map,omitempty"`

	// Whether tap-and-drag is enabled. It can be "enabled" or "disabled"
	TapDrag           string     `json:"tap_drag,omitempty"`

	// Whether drag-lock is enabled. It can be "enabled" or "disabled"
	TapDragLock       string     `json:"tap_drag_lock,omitempty"`

	// The pointer-acceleration in use
	AccelSpeed        float64    `json:"accel_speed,omitempty"`

	// The acceleration profile in use. It can be "none", "flat", or "adaptive"
	AccelProfile      string     `json:"accel_profile,omitempty"`

	// Whether natural scrolling is enabled. It can be "enabled" or "disabled"
	NaturalScroll     string     `json:"natural_scroll,omitempty"`

	// Whether left-handed mode is enabled. It can be "enabled" or "disabled"
	LeftHanded        string     `json:"left_handed,omitempty"`

	// The click method in use. It can be "none", "button_areas", or "clickfinger"
	ClickMethod       string     `json:"click_method,omitempty"`

	// Whether middle emulation is enabled. It can be "enabled" or "disabled"
	MiddleEmulation   string     `json:"middle_emulation,omitempty"`

	// The scroll method in use.
	// It can be "none", "two_finger", "edge", or "on_button_down"
	ScrollMethod      string     `json:"scroll_method,omitempty"`

	// The scroll button to use when "scroll_method" is "on_button_down".
	// This will be given as an input event code
	ScrollButton      int64      `json:"scroll_button,omitempty"`

	// Whether disable-while-typing is enabled. It can be "enabled" or "disabled"
	DWT               string     `json:"dwt,omitempty"`

	// An array of 6 floats representing the calibration matrix for absolute
	// devices such as touchscreens
	CalibrationMatrix [6]float64 `json:"calibration_matrix,omitempty"`
}

type Input struct {
	// The identifier for the input device
	Identifier           string    `json:"identifier,omitempty"`

	// The human readable name for the device
	Name                 string    `json:"name,omitempty"`

	// The vendor code for the input device
	Vendor               int64     `json:"vendor,omitempty"`

	// The product code for the input device
	Product              int64     `json:"product,omitempty"`

	// The device type. Currently this can be "keyboard", "pointer", "touch",
	// "tablet_tool", "tablet_pad", or "switch"
	Type                 string    `json:"type,omitempty"`

	// (Only keyboards) The name of the active keyboard layout in use
	XKBActiveLayoutName  *string   `json:"xkb_active_layout_name,omitempty"`

	// (Only keyboards) A list a layout names configured for the keyboard
	XKBLayoutNames       []string `json:"xkb_layout_names,omitempty"`

	// (Only keyboards) The index of the active keyboard layout in use
	XKBActiveLayoutIndex *int64    `json:"xkb_active_layout_index,omitempty"`

	// (Only libinput devices) An object describing the current device settings.
	LibInput             *LibInput `json:"libinput,omitempty"`
}

type Seat struct {
	// The unique name for the seat
	Name         string  `json:"name,omitempty"`

	// The number of capabilities that the seat has
	Capabilities int64   `json:"capabilities,omitempty"`

	// The id of the node currently focused by the seat or 0 when the seat is
	// not currently focused by a node (i.e. a surface layer or xwayland
	// unmanaged has focus)
	Focus        int64   `json:"focus,omitempty"`

	// An array of input devices that are attached to the seat.
	// Currently, this is an array of objects that are identical to those
	// returned by GET_INPUTS
	Devices      []Input `json:"devices,omitempty"`
}

// ModeEvent is sent whenever the binding mode changes
type ModeEvent struct {
	// The binding mode that became active
	Change string `json:"change,omitempty"`

	// Whether the mode should be parsed as pango markup
	PangoMarkup bool `json:"pango_markup,omitempty"`
}

type Binding struct {
	// The command associated with the binding
	Command string `json:"command,omitempty"`

	// An array of strings that correspond to each modifier key for the binding
	EventStateMask []string `json:"event_state_mask,omitempty"`

	// For keyboard bindcodes, this is the key code for the binding. For mouse
	// bindings, this is the X11 button number, if there is an equivalent. In
	// all other cases, this will be 0.
	InputCode int64 `json:"input_code,omitempty"`

	// For keyboard bindsyms, this is the bindsym for the binding. Otherwise,
	// this will be null
	Symbol *string `json:"symbol,omitempty"`

	// The input type that triggered the binding. This is either "keyboard" or
	// "mouse"
	InputType string `json:"input_type,omitempty"`
}

// BindingEvent is sent whenever a binding is executed
type BindingEvent struct {
	// Currently this will only be "run"
	Change  string  `json:"change,omitempty"`

	Binding Binding `json:"binding,omitempty"`
}

// TickEvent is sent when first subscribing to tick events or by a SEND_TICK
// message
type TickEvent struct {
	// Whether this event was triggered by subscribing to the tick events
	First bool `json:"first,omitempty"`

	// The payload given with a SEND_TICK message, if any.
	// Otherwise, an empty string
	Payload string `json:"payload,omitempty"`
}

// BarStateUpdateEvent is sent when the visibility of a bar changes due to a
// modifier being pressed
type BarStateUpdateEvent struct {
	// The bar ID effected
	ID string `json:"id,omitempty"`

	// Whether the bar should be made visible due to a modifier being pressed
	VisibleByModifier bool `json:"visible_by_modifier,omitempty"`
}

// Deprecated: BarStatusUpdateEvent is deprecated, use BarStateUpdateEvent instead
type BarStatusUpdateEvent = BarStateUpdateEvent

// InputEvent is sent when something related to the input devices changes.
type InputEvent struct {
	// What has changed
	//
	// The following change types are currently available:
	// added:           The input device became available
	// removed:         The input device is no longer available
	// xkb_keymap:      (Keyboards only) The keymap for the keyboard has changed
	// xkb_layout:      (Keyboards only) The effective layout in the keymap
	//                  has changed
	// libinput_config: (libinput device only) A libinput config option for the
	//                  device changed
	Change string `json:"change,omitempty"`

	// An object representing the input that is identical the ones
	// GET_INPUTS gives
	Input Input `json:"input,omitempty"`
}