Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
fab8fe2
snowcap: widget/container: Add user-defined id to Container
Ph4ntomas Dec 16, 2025
8423eac
snowcap: input: Prepare for more keyboard input receiver
Ph4ntomas Dec 17, 2025
9569d15
fix(xdg_popup): Don't send additional configure on reposition
Ph4ntomas Dec 18, 2025
96bc2eb
snowcap: Add function to get SnowcapSurface from WlSurface
Ph4ntomas Feb 3, 2026
e48f994
pinnacle: respect popup constraint adjustment
Ph4ntomas Dec 23, 2025
ee566f2
snowcap: Store active WlSeat in state
Ph4ntomas Jan 25, 2026
8028684
snowcap: popup: Initial implementation
Ph4ntomas Dec 14, 2025
baea3f7
snowcap: popup: Support nested popups
Ph4ntomas Dec 14, 2025
3459f34
snowcap: popup: Enforce close order
Ph4ntomas Dec 14, 2025
1b7b0e0
snowcap: popup: close popup when layer is destroyed.
Ph4ntomas Dec 15, 2025
3b34043
snowcap: popup: Popup positioning
Ph4ntomas Dec 15, 2025
8146dfd
snowcap: popup: Gravity & Anchor
Ph4ntomas Dec 16, 2025
8f73fba
snowcap: popup: Offset
Ph4ntomas Dec 16, 2025
07a4d75
snowcap: popup: Position popup at widget
Ph4ntomas Dec 16, 2025
5e8b295
snowcap: popup: Keyboard Grab & events for popups
Ph4ntomas Dec 17, 2025
5306a5f
snowcap: popup: Disallow more than one child popup per parent
Ph4ntomas Dec 17, 2025
3dae9bd
snowcap: popup: Make constraint adjustment configurable
Ph4ntomas Dec 17, 2025
5a9b2a2
snowcap: popup: Allow updating positioner attributes
Ph4ntomas Dec 18, 2025
364b1bb
snowcap: popup: Support widget operations
Ph4ntomas Dec 19, 2025
0b4a9db
snowcap: popup: Replace existing popup
Ph4ntomas Dec 21, 2025
7ac6f02
snowcap: lua: Support Popup
Ph4ntomas Dec 14, 2025
a69742f
snowcap: rust: Support Popup
Ph4ntomas Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions api/lua/pinnacle-api-dev-1.rockspec
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ build = {
["pinnacle.snowcap.snowcap.widget.operation"] = "pinnacle/snowcap/snowcap/widget/operation.lua",
["pinnacle.snowcap.snowcap.layer"] = "pinnacle/snowcap/snowcap/layer.lua",
["pinnacle.snowcap.snowcap.decoration"] = "pinnacle/snowcap/snowcap/decoration.lua",
["pinnacle.snowcap.snowcap.popup"] = "pinnacle/snowcap/snowcap/popup.lua",
["pinnacle.snowcap.snowcap.util"] = "pinnacle/snowcap/snowcap/util.lua",
["pinnacle.snowcap.snowcap.log"] = "pinnacle/snowcap/snowcap/log.lua",
},
Expand Down
1 change: 1 addition & 0 deletions snowcap/api/lua/snowcap-api-dev-1.rockspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ build = {
["snowcap.widget.operation"] = "snowcap/widget/operation.lua",
["snowcap.layer"] = "snowcap/layer.lua",
["snowcap.decoration"] = "snowcap/decoration.lua",
["snowcap.popup"] = "snowcap/popup.lua",
["snowcap.util"] = "snowcap/util.lua",
["snowcap.log"] = "snowcap/log.lua",
},
Expand Down
201 changes: 200 additions & 1 deletion snowcap/api/lua/snowcap/grpc/defs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,34 @@ local snowcap_layer_v1_Layer = {
LAYER_OVERLAY = 4,
}

---@enum snowcap.popup.v1.Anchor
local snowcap_popup_v1_Anchor = {
ANCHOR_UNSPECIFIED = 0,
ANCHOR_TOP = 1,
ANCHOR_BOTTOM = 2,
ANCHOR_LEFT = 3,
ANCHOR_RIGHT = 4,
ANCHOR_TOP_LEFT = 5,
ANCHOR_TOP_RIGHT = 6,
ANCHOR_BOTTOM_LEFT = 7,
ANCHOR_BOTTOM_RIGHT = 8,
ANCHOR_NONE = 9,
}

---@enum snowcap.popup.v1.Gravity
local snowcap_popup_v1_Gravity = {
GRAVITY_UNSPECIFIED = 0,
GRAVITY_TOP = 1,
GRAVITY_BOTTOM = 2,
GRAVITY_LEFT = 3,
GRAVITY_RIGHT = 4,
GRAVITY_TOP_LEFT = 5,
GRAVITY_TOP_RIGHT = 6,
GRAVITY_BOTTOM_LEFT = 7,
GRAVITY_BOTTOM_RIGHT = 8,
GRAVITY_NONE = 9,
}


---@alias google.protobuf.Empty nil

Expand Down Expand Up @@ -849,6 +877,7 @@ local snowcap_layer_v1_Layer = {
---@field clip boolean?
---@field child snowcap.widget.v1.WidgetDef?
---@field style snowcap.widget.v1.Container.Style?
---@field id string?

---@class snowcap.widget.v1.Container.Style
---@field text_color snowcap.widget.v1.Color?
Expand Down Expand Up @@ -995,6 +1024,7 @@ local snowcap_layer_v1_Layer = {
---@class snowcap.widget.v1.GetWidgetEventsRequest
---@field layer_id integer?
---@field decoration_id integer?
---@field popup_id integer?

---@class snowcap.widget.v1.WidgetEvent
---@field widget_id integer?
Expand Down Expand Up @@ -1112,7 +1142,8 @@ local snowcap_layer_v1_Layer = {
---@field super boolean?

---@class snowcap.input.v1.KeyboardKeyRequest
---@field id integer?
---@field layer_id integer?
---@field popup_id integer?

---@class snowcap.input.v1.KeyboardKeyResponse
---@field key integer?
Expand Down Expand Up @@ -1277,6 +1308,71 @@ local snowcap_layer_v1_Layer = {

---@class snowcap.layer.v1.ViewResponse

---@class snowcap.popup.v1.Offset
---@field x number?
---@field y number?

---@class snowcap.popup.v1.Rectangle
---@field x number?
---@field y number?
---@field width number?
---@field height number?

---@class snowcap.popup.v1.ConstraintsAdjust
---@field none boolean?
---@field slide_x boolean?
---@field slide_y boolean?
---@field flip_x boolean?
---@field flip_y boolean?
---@field resize_x boolean?
---@field resize_y boolean?

---@class snowcap.popup.v1.Position
---@field at_cursor google.protobuf.Empty?
---@field absolute snowcap.popup.v1.Rectangle?
---@field at_widget string?

---@class snowcap.popup.v1.NewPopupRequest
---@field widget_def snowcap.widget.v1.WidgetDef?
---@field layer_id integer?
---@field deco_id integer?
---@field popup_id integer?
---@field position snowcap.popup.v1.Position?
---@field anchor snowcap.popup.v1.Anchor?
---@field gravity snowcap.popup.v1.Gravity?
---@field offset snowcap.popup.v1.Offset?
---@field constraints_adjust snowcap.popup.v1.ConstraintsAdjust?
---@field no_grab boolean?
---@field no_replace boolean?

---@class snowcap.popup.v1.NewPopupResponse
---@field popup_id integer?

---@class snowcap.popup.v1.CloseRequest
---@field popup_id integer?

---@class snowcap.popup.v1.OperatePopupRequest
---@field popup_id integer?
---@field operation snowcap.operation.v1.Operation?

---@class snowcap.popup.v1.OperatePopupResponse

---@class snowcap.popup.v1.UpdatePopupRequest
---@field popup_id integer?
---@field widget_def snowcap.widget.v1.WidgetDef?
---@field position snowcap.popup.v1.Position?
---@field anchor snowcap.popup.v1.Anchor?
---@field gravity snowcap.popup.v1.Gravity?
---@field offset snowcap.popup.v1.Offset?
---@field constraints_adjust snowcap.popup.v1.ConstraintsAdjust?

---@class snowcap.popup.v1.UpdatePopupResponse

---@class snowcap.popup.v1.ViewRequest
---@field popup_id integer?

---@class snowcap.popup.v1.ViewResponse

---@class snowcap.v0alpha1.Nothing

---@class snowcap.v1.Nothing
Expand Down Expand Up @@ -1402,6 +1498,21 @@ snowcap.layer.v1.UpdateLayerRequest = {}
snowcap.layer.v1.UpdateLayerResponse = {}
snowcap.layer.v1.ViewRequest = {}
snowcap.layer.v1.ViewResponse = {}
snowcap.popup = {}
snowcap.popup.v1 = {}
snowcap.popup.v1.Offset = {}
snowcap.popup.v1.Rectangle = {}
snowcap.popup.v1.ConstraintsAdjust = {}
snowcap.popup.v1.Position = {}
snowcap.popup.v1.NewPopupRequest = {}
snowcap.popup.v1.NewPopupResponse = {}
snowcap.popup.v1.CloseRequest = {}
snowcap.popup.v1.OperatePopupRequest = {}
snowcap.popup.v1.OperatePopupResponse = {}
snowcap.popup.v1.UpdatePopupRequest = {}
snowcap.popup.v1.UpdatePopupResponse = {}
snowcap.popup.v1.ViewRequest = {}
snowcap.popup.v1.ViewResponse = {}
snowcap.v0alpha1 = {}
snowcap.v0alpha1.Nothing = {}
snowcap.v1 = {}
Expand All @@ -1424,6 +1535,8 @@ snowcap.layer.v0alpha1.Layer = snowcap_layer_v0alpha1_Layer
snowcap.layer.v1.Anchor = snowcap_layer_v1_Anchor
snowcap.layer.v1.KeyboardInteractivity = snowcap_layer_v1_KeyboardInteractivity
snowcap.layer.v1.Layer = snowcap_layer_v1_Layer
snowcap.popup.v1.Anchor = snowcap_popup_v1_Anchor
snowcap.popup.v1.Gravity = snowcap_popup_v1_Gravity

snowcap.widget.v1.WidgetService = {}
snowcap.widget.v1.WidgetService.GetWidgetEvents = {}
Expand Down Expand Up @@ -1730,6 +1843,92 @@ snowcap.layer.v1.LayerService.RequestView.response = ".snowcap.layer.v1.ViewResp
function Client:snowcap_layer_v1_LayerService_RequestView(data)
return self:unary_request(snowcap.layer.v1.LayerService.RequestView, data)
end
snowcap.popup.v1.PopupService = {}
snowcap.popup.v1.PopupService.NewPopup = {}
snowcap.popup.v1.PopupService.NewPopup.service = "snowcap.popup.v1.PopupService"
snowcap.popup.v1.PopupService.NewPopup.method = "NewPopup"
snowcap.popup.v1.PopupService.NewPopup.request = ".snowcap.popup.v1.NewPopupRequest"
snowcap.popup.v1.PopupService.NewPopup.response = ".snowcap.popup.v1.NewPopupResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.popup.v1.NewPopupRequest
---
---@return snowcap.popup.v1.NewPopupResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_popup_v1_PopupService_NewPopup(data)
return self:unary_request(snowcap.popup.v1.PopupService.NewPopup, data)
end
snowcap.popup.v1.PopupService.Close = {}
snowcap.popup.v1.PopupService.Close.service = "snowcap.popup.v1.PopupService"
snowcap.popup.v1.PopupService.Close.method = "Close"
snowcap.popup.v1.PopupService.Close.request = ".snowcap.popup.v1.CloseRequest"
snowcap.popup.v1.PopupService.Close.response = ".google.protobuf.Empty"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.popup.v1.CloseRequest
---
---@return google.protobuf.Empty | nil response
---@return string | nil error An error string, if any
function Client:snowcap_popup_v1_PopupService_Close(data)
return self:unary_request(snowcap.popup.v1.PopupService.Close, data)
end
snowcap.popup.v1.PopupService.OperatePopup = {}
snowcap.popup.v1.PopupService.OperatePopup.service = "snowcap.popup.v1.PopupService"
snowcap.popup.v1.PopupService.OperatePopup.method = "OperatePopup"
snowcap.popup.v1.PopupService.OperatePopup.request = ".snowcap.popup.v1.OperatePopupRequest"
snowcap.popup.v1.PopupService.OperatePopup.response = ".snowcap.popup.v1.OperatePopupResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.popup.v1.OperatePopupRequest
---
---@return snowcap.popup.v1.OperatePopupResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_popup_v1_PopupService_OperatePopup(data)
return self:unary_request(snowcap.popup.v1.PopupService.OperatePopup, data)
end
snowcap.popup.v1.PopupService.UpdatePopup = {}
snowcap.popup.v1.PopupService.UpdatePopup.service = "snowcap.popup.v1.PopupService"
snowcap.popup.v1.PopupService.UpdatePopup.method = "UpdatePopup"
snowcap.popup.v1.PopupService.UpdatePopup.request = ".snowcap.popup.v1.UpdatePopupRequest"
snowcap.popup.v1.PopupService.UpdatePopup.response = ".snowcap.popup.v1.UpdatePopupResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.popup.v1.UpdatePopupRequest
---
---@return snowcap.popup.v1.UpdatePopupResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_popup_v1_PopupService_UpdatePopup(data)
return self:unary_request(snowcap.popup.v1.PopupService.UpdatePopup, data)
end
snowcap.popup.v1.PopupService.RequestView = {}
snowcap.popup.v1.PopupService.RequestView.service = "snowcap.popup.v1.PopupService"
snowcap.popup.v1.PopupService.RequestView.method = "RequestView"
snowcap.popup.v1.PopupService.RequestView.request = ".snowcap.popup.v1.ViewRequest"
snowcap.popup.v1.PopupService.RequestView.response = ".snowcap.popup.v1.ViewResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.popup.v1.ViewRequest
---
---@return snowcap.popup.v1.ViewResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_popup_v1_PopupService_RequestView(data)
return self:unary_request(snowcap.popup.v1.PopupService.RequestView, data)
end
return {
google = google,
snowcap = snowcap,
Expand Down
1 change: 1 addition & 0 deletions snowcap/api/lua/snowcap/grpc/protobuf.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ function protobuf.build_protos()
"snowcap/widget/" .. version .. "/widget.proto",
"snowcap/operation/" .. version .. "/operation.proto",
"snowcap/decoration/" .. version .. "/decoration.proto",
"snowcap/popup/" .. version .. "/popup.proto",
"google/protobuf/empty.proto",
}

Expand Down
8 changes: 7 additions & 1 deletion snowcap/api/lua/snowcap/layer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ local layer_handle = {}
---@field private _update fun(msg:any)
local LayerHandle = {}

---Convert a LayerHandle into a Popup's ParentHandle
---@return snowcap.popup.ParentHandle
function LayerHandle:as_parent()
return require("snowcap.popup").parent.Layer(self)
end

---@param id integer
---@param update fun(msg: any)
---@return snowcap.layer.LayerHandle
Expand Down Expand Up @@ -164,7 +170,7 @@ end
---@param on_event fun(handle: snowcap.layer.LayerHandle, event: snowcap.input.KeyEvent)
function LayerHandle:on_key_event(on_event)
local err = client:snowcap_input_v1_InputService_KeyboardKey(
{ id = self.id },
{ layer_id = self.id },
function(response)
---@cast response snowcap.input.v1.KeyboardKeyResponse

Expand Down
Loading
Loading