Skip to content

Commit fb94ca7

Browse files
committed
snowcap-api: lua: Properly handle close events for surfaces
1 parent 5c98943 commit fb94ca7

7 files changed

Lines changed: 119 additions & 17 deletions

File tree

api/lua/build/grpc_client.lua

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ end
314314
---
315315
---@param request_specifier grpc_client.RequestSpecifier
316316
---@param data table The message to send. This should be in the structure of `request_specifier.request`.
317-
---@param callback fun(response: table) A callback that will be run with every response
317+
---@param callback fun(response: table): boolean? A callback that will be run with every response
318318
---@param done? fun() A callback that will be run when the stream closes.
319319
---
320320
---@return string|nil error An error string, if any.
@@ -355,6 +355,7 @@ function Client:server_streaming_request(request_specifier, data, callback, done
355355

356356
self.loop:wrap(function()
357357
for response_body in stream:each_chunk() do
358+
local stop = nil
358359
while response_body:len() > 0 do
359360
local msg_len = string.unpack(">I4", response_body:sub(2, 5))
360361

@@ -369,10 +370,18 @@ function Client:server_streaming_request(request_specifier, data, callback, done
369370
end
370371

371372
local response = obj
372-
callback(response)
373+
local should_stop = callback(response)
374+
375+
if should_stop then
376+
stop = true
377+
end
373378

374379
response_body = response_body:sub(msg_len + 6)
375380
end
381+
382+
if stop == true then
383+
break
384+
end
376385
end
377386

378387
if done then

api/lua/build/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ end"#,
314314
---@nodiscard
315315
---
316316
---@param data {data_ty}
317-
---@param callback fun(response: {ret_ty})
317+
---@param callback fun(response: {ret_ty}): boolean?
318318
---@param done? fun()
319319
---
320320
---@return string | nil An error string, if any

api/lua/pinnacle/grpc/defs.lua

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ end
316316
---
317317
---@param request_specifier grpc_client.RequestSpecifier
318318
---@param data table The message to send. This should be in the structure of `request_specifier.request`.
319-
---@param callback fun(response: table) A callback that will be run with every response
319+
---@param callback fun(response: table): boolean? A callback that will be run with every response
320320
---@param done? fun() A callback that will be run when the stream closes.
321321
---
322322
---@return string|nil error An error string, if any.
@@ -357,6 +357,7 @@ function Client:server_streaming_request(request_specifier, data, callback, done
357357

358358
self.loop:wrap(function()
359359
for response_body in stream:each_chunk() do
360+
local stop = nil
360361
while response_body:len() > 0 do
361362
local msg_len = string.unpack(">I4", response_body:sub(2, 5))
362363

@@ -371,10 +372,18 @@ function Client:server_streaming_request(request_specifier, data, callback, done
371372
end
372373

373374
local response = obj
374-
callback(response)
375+
local should_stop = callback(response)
376+
377+
if should_stop then
378+
stop = true
379+
end
375380

376381
response_body = response_body:sub(msg_len + 6)
377382
end
383+
384+
if stop == true then
385+
break
386+
end
378387
end
379388

380389
if done then
@@ -1835,7 +1844,7 @@ pinnacle.input.v1.InputService.KeybindStream.response = ".pinnacle.input.v1.Keyb
18351844
---@nodiscard
18361845
---
18371846
---@param data pinnacle.input.v1.KeybindStreamRequest
1838-
---@param callback fun(response: pinnacle.input.v1.KeybindStreamResponse)
1847+
---@param callback fun(response: pinnacle.input.v1.KeybindStreamResponse): boolean?
18391848
---@param done? fun()
18401849
---
18411850
---@return string | nil An error string, if any
@@ -1855,7 +1864,7 @@ pinnacle.input.v1.InputService.MousebindStream.response = ".pinnacle.input.v1.Mo
18551864
---@nodiscard
18561865
---
18571866
---@param data pinnacle.input.v1.MousebindStreamRequest
1858-
---@param callback fun(response: pinnacle.input.v1.MousebindStreamResponse)
1867+
---@param callback fun(response: pinnacle.input.v1.MousebindStreamResponse): boolean?
18591868
---@param done? fun()
18601869
---
18611870
---@return string | nil An error string, if any
@@ -2512,7 +2521,7 @@ pinnacle.process.v1.ProcessService.WaitOnSpawn.response = ".pinnacle.process.v1.
25122521
---@nodiscard
25132522
---
25142523
---@param data pinnacle.process.v1.WaitOnSpawnRequest
2515-
---@param callback fun(response: pinnacle.process.v1.WaitOnSpawnResponse)
2524+
---@param callback fun(response: pinnacle.process.v1.WaitOnSpawnResponse): boolean?
25162525
---@param done? fun()
25172526
---
25182527
---@return string | nil An error string, if any

snowcap/api/lua/snowcap/decoration.lua

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,22 @@ function decoration.new_widget(args)
119119
created = widget.SurfaceHandle.from_decoration_handle(handle),
120120
})
121121

122+
err = client:snowcap_decoration_v1_DecorationService_GetDecorationEvents({
123+
decoration_id = decoration_id,
124+
}, function(response) ---@diagnostic disable-line:redefined-local
125+
response.decoration_events = response.decoration_events or {}
126+
127+
for _, decoration_event in ipairs(response.decoration_events) do
128+
if decoration_event.closing ~= nil then
129+
return true
130+
end
131+
end
132+
end, function()
133+
args.program:event({
134+
closing = {},
135+
})
136+
end)
137+
122138
err = client:snowcap_widget_v1_WidgetService_GetWidgetEvents({
123139
decoration_id = decoration_id,
124140
}, function(response) ---@diagnostic disable-line: redefined-local

snowcap/api/lua/snowcap/grpc/defs.lua

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ end
316316
---
317317
---@param request_specifier grpc_client.RequestSpecifier
318318
---@param data table The message to send. This should be in the structure of `request_specifier.request`.
319-
---@param callback fun(response: table) A callback that will be run with every response
319+
---@param callback fun(response: table): boolean? A callback that will be run with every response
320320
---@param done? fun() A callback that will be run when the stream closes.
321321
---
322322
---@return string|nil error An error string, if any.
@@ -357,6 +357,7 @@ function Client:server_streaming_request(request_specifier, data, callback, done
357357

358358
self.loop:wrap(function()
359359
for response_body in stream:each_chunk() do
360+
local stop = nil
360361
while response_body:len() > 0 do
361362
local msg_len = string.unpack(">I4", response_body:sub(2, 5))
362363

@@ -371,10 +372,18 @@ function Client:server_streaming_request(request_specifier, data, callback, done
371372
end
372373

373374
local response = obj
374-
callback(response)
375+
local should_stop = callback(response)
376+
377+
if should_stop then
378+
stop = true
379+
end
375380

376381
response_body = response_body:sub(msg_len + 6)
377382
end
383+
384+
if stop == true then
385+
break
386+
end
378387
end
379388

380389
if done then
@@ -1138,6 +1147,17 @@ local snowcap_popup_v1_PopupEvent_Focus = {
11381147

11391148
---@class snowcap.decoration.v1.ViewResponse
11401149

1150+
---@class snowcap.decoration.v1.GetDecorationEventsRequest
1151+
---@field decoration_id integer?
1152+
1153+
---@class snowcap.decoration.v1.DecorationEvent
1154+
---@field closing snowcap.decoration.v1.DecorationEvent.Closing?
1155+
1156+
---@class snowcap.decoration.v1.DecorationEvent.Closing
1157+
1158+
---@class snowcap.decoration.v1.GetDecorationEventsResponse
1159+
---@field decoration_events snowcap.decoration.v1.DecorationEvent[]?
1160+
11411161
---@class snowcap.input.v0alpha1.Modifiers
11421162
---@field shift boolean?
11431163
---@field ctrl boolean?
@@ -1337,6 +1357,9 @@ local snowcap_popup_v1_PopupEvent_Focus = {
13371357

13381358
---@class snowcap.layer.v1.LayerEvent
13391359
---@field focus snowcap.layer.v1.LayerEvent.Focus?
1360+
---@field closing snowcap.layer.v1.LayerEvent.Closing?
1361+
1362+
---@class snowcap.layer.v1.LayerEvent.Closing
13401363

13411364
---@class snowcap.layer.v1.GetLayerEventsResponse
13421365
---@field layer_events snowcap.layer.v1.LayerEvent[]?
@@ -1411,6 +1434,9 @@ local snowcap_popup_v1_PopupEvent_Focus = {
14111434

14121435
---@class snowcap.popup.v1.PopupEvent
14131436
---@field focus snowcap.popup.v1.PopupEvent.Focus?
1437+
---@field closing snowcap.popup.v1.PopupEvent.Closing?
1438+
1439+
---@class snowcap.popup.v1.PopupEvent.Closing
14141440

14151441
---@class snowcap.popup.v1.GetPopupEventsResponse
14161442
---@field popup_events snowcap.popup.v1.PopupEvent[]?
@@ -1498,6 +1524,10 @@ snowcap.decoration.v1.UpdateDecorationRequest = {}
14981524
snowcap.decoration.v1.UpdateDecorationResponse = {}
14991525
snowcap.decoration.v1.ViewRequest = {}
15001526
snowcap.decoration.v1.ViewResponse = {}
1527+
snowcap.decoration.v1.GetDecorationEventsRequest = {}
1528+
snowcap.decoration.v1.DecorationEvent = {}
1529+
snowcap.decoration.v1.DecorationEvent.Closing = {}
1530+
snowcap.decoration.v1.GetDecorationEventsResponse = {}
15011531
snowcap.input = {}
15021532
snowcap.input.v0alpha1 = {}
15031533
snowcap.input.v0alpha1.Modifiers = {}
@@ -1542,6 +1572,7 @@ snowcap.layer.v1.ViewRequest = {}
15421572
snowcap.layer.v1.ViewResponse = {}
15431573
snowcap.layer.v1.GetLayerEventsRequest = {}
15441574
snowcap.layer.v1.LayerEvent = {}
1575+
snowcap.layer.v1.LayerEvent.Closing = {}
15451576
snowcap.layer.v1.GetLayerEventsResponse = {}
15461577
snowcap.popup = {}
15471578
snowcap.popup.v1 = {}
@@ -1560,6 +1591,7 @@ snowcap.popup.v1.ViewRequest = {}
15601591
snowcap.popup.v1.ViewResponse = {}
15611592
snowcap.popup.v1.GetPopupEventsRequest = {}
15621593
snowcap.popup.v1.PopupEvent = {}
1594+
snowcap.popup.v1.PopupEvent.Closing = {}
15631595
snowcap.popup.v1.GetPopupEventsResponse = {}
15641596
snowcap.v0alpha1 = {}
15651597
snowcap.v0alpha1.Nothing = {}
@@ -1602,7 +1634,7 @@ snowcap.widget.v1.WidgetService.GetWidgetEvents.response = ".snowcap.widget.v1.G
16021634
---@nodiscard
16031635
---
16041636
---@param data snowcap.widget.v1.GetWidgetEventsRequest
1605-
---@param callback fun(response: snowcap.widget.v1.GetWidgetEventsResponse)
1637+
---@param callback fun(response: snowcap.widget.v1.GetWidgetEventsResponse): boolean?
16061638
---@param done? fun()
16071639
---
16081640
---@return string | nil An error string, if any
@@ -1695,6 +1727,26 @@ snowcap.decoration.v1.DecorationService.RequestView.response = ".snowcap.decorat
16951727
function Client:snowcap_decoration_v1_DecorationService_RequestView(data)
16961728
return self:unary_request(snowcap.decoration.v1.DecorationService.RequestView, data)
16971729
end
1730+
snowcap.decoration.v1.DecorationService.GetDecorationEvents = {}
1731+
snowcap.decoration.v1.DecorationService.GetDecorationEvents.service = "snowcap.decoration.v1.DecorationService"
1732+
snowcap.decoration.v1.DecorationService.GetDecorationEvents.method = "GetDecorationEvents"
1733+
snowcap.decoration.v1.DecorationService.GetDecorationEvents.request = ".snowcap.decoration.v1.GetDecorationEventsRequest"
1734+
snowcap.decoration.v1.DecorationService.GetDecorationEvents.response = ".snowcap.decoration.v1.GetDecorationEventsResponse"
1735+
1736+
---Performs a server-streaming request.
1737+
---
1738+
---`callback` will be called with every streamed response.
1739+
---
1740+
---@nodiscard
1741+
---
1742+
---@param data snowcap.decoration.v1.GetDecorationEventsRequest
1743+
---@param callback fun(response: snowcap.decoration.v1.GetDecorationEventsResponse): boolean?
1744+
---@param done? fun()
1745+
---
1746+
---@return string | nil An error string, if any
1747+
function Client:snowcap_decoration_v1_DecorationService_GetDecorationEvents(data, callback, done)
1748+
return self:server_streaming_request(snowcap.decoration.v1.DecorationService.GetDecorationEvents, data, callback, done)
1749+
end
16981750
snowcap.input.v0alpha1.InputService = {}
16991751
snowcap.input.v0alpha1.InputService.KeyboardKey = {}
17001752
snowcap.input.v0alpha1.InputService.KeyboardKey.service = "snowcap.input.v0alpha1.InputService"
@@ -1709,7 +1761,7 @@ snowcap.input.v0alpha1.InputService.KeyboardKey.response = ".snowcap.input.v0alp
17091761
---@nodiscard
17101762
---
17111763
---@param data snowcap.input.v0alpha1.KeyboardKeyRequest
1712-
---@param callback fun(response: snowcap.input.v0alpha1.KeyboardKeyResponse)
1764+
---@param callback fun(response: snowcap.input.v0alpha1.KeyboardKeyResponse): boolean?
17131765
---@param done? fun()
17141766
---
17151767
---@return string | nil An error string, if any
@@ -1729,7 +1781,7 @@ snowcap.input.v0alpha1.InputService.PointerButton.response = ".snowcap.input.v0a
17291781
---@nodiscard
17301782
---
17311783
---@param data snowcap.input.v0alpha1.PointerButtonRequest
1732-
---@param callback fun(response: snowcap.input.v0alpha1.PointerButtonResponse)
1784+
---@param callback fun(response: snowcap.input.v0alpha1.PointerButtonResponse): boolean?
17331785
---@param done? fun()
17341786
---
17351787
---@return string | nil An error string, if any
@@ -1750,7 +1802,7 @@ snowcap.input.v1.InputService.KeyboardKey.response = ".snowcap.input.v1.Keyboard
17501802
---@nodiscard
17511803
---
17521804
---@param data snowcap.input.v1.KeyboardKeyRequest
1753-
---@param callback fun(response: snowcap.input.v1.KeyboardKeyResponse)
1805+
---@param callback fun(response: snowcap.input.v1.KeyboardKeyResponse): boolean?
17541806
---@param done? fun()
17551807
---
17561808
---@return string | nil An error string, if any
@@ -1770,7 +1822,7 @@ snowcap.input.v1.InputService.PointerButton.response = ".snowcap.input.v1.Pointe
17701822
---@nodiscard
17711823
---
17721824
---@param data snowcap.input.v1.PointerButtonRequest
1773-
---@param callback fun(response: snowcap.input.v1.PointerButtonResponse)
1825+
---@param callback fun(response: snowcap.input.v1.PointerButtonResponse): boolean?
17741826
---@param done? fun()
17751827
---
17761828
---@return string | nil An error string, if any
@@ -1911,7 +1963,7 @@ snowcap.layer.v1.LayerService.GetLayerEvents.response = ".snowcap.layer.v1.GetLa
19111963
---@nodiscard
19121964
---
19131965
---@param data snowcap.layer.v1.GetLayerEventsRequest
1914-
---@param callback fun(response: snowcap.layer.v1.GetLayerEventsResponse)
1966+
---@param callback fun(response: snowcap.layer.v1.GetLayerEventsResponse): boolean?
19151967
---@param done? fun()
19161968
---
19171969
---@return string | nil An error string, if any
@@ -2017,7 +2069,7 @@ snowcap.popup.v1.PopupService.GetPopupEvents.response = ".snowcap.popup.v1.GetPo
20172069
---@nodiscard
20182070
---
20192071
---@param data snowcap.popup.v1.GetPopupEventsRequest
2020-
---@param callback fun(response: snowcap.popup.v1.GetPopupEventsResponse)
2072+
---@param callback fun(response: snowcap.popup.v1.GetPopupEventsResponse): boolean?
20212073
---@param done? fun()
20222074
---
20232075
---@return string | nil An error string, if any

snowcap/api/lua/snowcap/layer.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ function layer.new_widget(args)
177177
response.layer_events = response.layer_events or {}
178178

179179
for _, layer_event in ipairs(response.layer_events) do
180+
if layer_event.closing ~= nil then
181+
return true
182+
end
183+
180184
local focus = layer_event.focus --[[@as snowcap.layer.FocusEvent]]
181185
---@type snowcap.widget.SurfaceEvent?
182186
local event = nil
@@ -204,6 +208,10 @@ function layer.new_widget(args)
204208
if err then
205209
log.error(err)
206210
end
211+
end, function()
212+
args.program:event({
213+
closing = {},
214+
})
207215
end)
208216

209217
err = client:snowcap_widget_v1_WidgetService_GetWidgetEvents({

snowcap/api/lua/snowcap/popup.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,10 @@ function popup.new_widget(args)
310310
response.popup_events = response.popup_events or {}
311311

312312
for _, popup_event in ipairs(response.popup_events) do
313+
if popup_event.closing ~= nil then
314+
return true
315+
end
316+
313317
local focus = popup_event.focus --[[@as snowcap.popup.FocusEvent]]
314318
---@type snowcap.widget.SurfaceEvent?
315319
local event = nil
@@ -337,6 +341,10 @@ function popup.new_widget(args)
337341
if err then
338342
log.error(err)
339343
end
344+
end, function()
345+
args.program:event({
346+
closing = {},
347+
})
340348
end)
341349

342350
err = client:snowcap_widget_v1_WidgetService_GetWidgetEvents({

0 commit comments

Comments
 (0)