diff --git a/src/siwin/platforms/wayland/siwinGlobals.nim b/src/siwin/platforms/wayland/siwinGlobals.nim index 86f2fd4..5f895ab 100644 --- a/src/siwin/platforms/wayland/siwinGlobals.nim +++ b/src/siwin/platforms/wayland/siwinGlobals.nim @@ -6,9 +6,14 @@ import ./[libwayland, protocol, bitfields, libdecor] type WaylandExtensionNotFound* = object of CatchableError + WaylandOutput* = object + registryName*: uint32 + output*: Wl_output + SiwinGlobalsWayland* = ref SiwinGlobalsWaylandObj SiwinGlobalsWaylandObj* = object of SiwinGlobals seatEventsInitialized*: bool + seatCapabilitiesChanged*: proc(globals: SiwinGlobalsWayland) dataDeviceManagerEventsInitialized*: bool display*: WlDisplay @@ -26,6 +31,7 @@ type viewporter*: Wp_viewporter fractionalScaleManager*: Wp_fractional_scale_manager_v1 xdgToplevelIconManager*: Xdg_toplevel_icon_manager_v1 + outputs*: seq[WaylandOutput] serverDecorationManager*: Zxdg_decoration_manager_v1 plasmaShell*: Org_kde_plasma_shell @@ -118,6 +124,8 @@ proc initRegistryCallbacks(globals: SiwinGlobalsWayland) = globals.seatCapabilities = globals.seatCapabilities.typeof.default globals.seat.onCapabilities: globals.seatCapabilities = capabilities.asBitfield + if not globals.seatCapabilitiesChanged.isNil: + globals.seatCapabilitiesChanged(globals) discard wl_display_roundtrip globals.display @@ -155,6 +163,9 @@ proc initRegistryCallbacks(globals: SiwinGlobalsWayland) = addRegistry Wp_cursor_shape_manager_v1: globals.cursorShapeManager = binded + addRegistry Wl_output: + globals.outputs.add WaylandOutput(registryName: name, output: binded) + proc isWaylandAvailable*: bool = proc isSocket(filename: string): bool = @@ -208,6 +219,12 @@ proc newWaylandGlobals*(): SiwinGlobalsWayland = if interfaceString == targetIface: callback(globals.registry, name, version) + globals.registry.onGlobal_remove: + for idx in countdown(globals.outputs.high, 0): + if globals.outputs[idx].registryName == name: + release globals.outputs[idx].output + globals.outputs.delete(idx) + proc roundtrip*(globals: SiwinGlobalsWayland) = discard wl_display_roundtrip globals.display diff --git a/src/siwin/platforms/wayland/window.nim b/src/siwin/platforms/wayland/window.nim index 51b9d3b..23cbb53 100644 --- a/src/siwin/platforms/wayland/window.nim +++ b/src/siwin/platforms/wayland/window.nim @@ -10,9 +10,46 @@ import ./[libwayland, protocol, siwinGlobals, sharedBuffer, bitfields, xkb, libd privateAccess Window +when siwin_use_pure_enums: + {.pragma: siwin_enum, pure.} +else: + {.pragma: siwin_enum.} + type + LayerSurfaceLayer* {.siwin_enum.} = enum + lslBackground + lslBottom + lslTop + lslOverlay + + LayerSurfaceAnchor* {.siwin_enum.} = enum + lsaTop + lsaBottom + lsaLeft + lsaRight + + LayerSurfaceKeyboardMode* {.siwin_enum.} = enum + lskNone + lskExclusive + lskOnDemand + + LayerSurfaceMargins* = object + top*: int32 + right*: int32 + bottom*: int32 + left*: int32 + + LayerSurfaceConfig* = object + layer*: LayerSurfaceLayer + anchors*: set[LayerSurfaceAnchor] + margins*: LayerSurfaceMargins + exclusiveZone*: int32 + keyboardMode*: LayerSurfaceKeyboardMode + namespace*: string + ScreenWayland* = ref object of Screen id: cint + output: Wl_output WindowWaylandKind* {.pure.} = enum XdgSurface @@ -22,6 +59,7 @@ type WindowWayland* = ref WindowWaylandObj WindowWaylandObj* = object of Window globals: SiwinGlobalsWayland + screen: ScreenWayland surface: Wl_surface xdgSurface: Xdg_surface xdgToplevel: Xdg_toplevel @@ -248,16 +286,19 @@ proc refreshKeyboardModifiers(window: WindowWayland) = method swapBuffers(window: WindowWayland) {.base.} = discard proc screenCountWayland*(globals: SiwinGlobalsWayland): int32 = - ## todo - 1 + globals.outputs.len.int32 proc screenWayland*(globals: SiwinGlobalsWayland, number: int32): ScreenWayland = new result if number notin 0..