Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
66 changes: 27 additions & 39 deletions snowcap/api/lua/snowcap/decoration.lua
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,7 @@ function decoration.new_widget(args)

local widget_def = args.program:view()

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)
widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

---@type snowcap.decoration.v1.NewDecorationRequest
local request = {
Expand Down Expand Up @@ -90,45 +82,41 @@ function decoration.new_widget(args)
local err = client:snowcap_widget_v1_WidgetService_GetWidgetEvents({
decoration_id = decoration_id,
}, function(response)
local widget_id = response.widget_id or 0
if response.button then
if callbacks[widget_id] then
args.program:update(callbacks[widget_id])
local widget_def = args.program:view()
callbacks = {}

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)

local _, err = client:snowcap_decoration_v1_DecorationService_UpdateDecoration({
decoration_id = decoration_id,
widget_def = widget.widget_def_into_api(widget_def),
})
for _, event in ipairs(response.widget_events) do
local widget_id = event.widget_id or 0
local msg = nil

if event.button then
msg = callbacks[widget_id]
end

if msg then
local ok, update_err = pcall(function()
args.program:update(msg)
end)
if not ok then
log.error(update_err)
end
end
end

local widget_def = args.program:view()
callbacks = {}

widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

local _, err = client:snowcap_decoration_v1_DecorationService_UpdateDecoration({
decoration_id = decoration_id,
widget_def = widget.widget_def_into_api(widget_def),
})
end)

return decoration_handle.new(decoration_id, function(msg)
args.program:update(msg)
local widget_def = args.program:view()
callbacks = {}

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)
widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

local _, err = client:snowcap_decoration_v1_DecorationService_UpdateDecoration({
decoration_id = decoration_id,
Expand Down
6 changes: 5 additions & 1 deletion snowcap/api/lua/snowcap/grpc/defs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -850,10 +850,13 @@ local snowcap_layer_v1_Layer = {
---@field layer_id integer?
---@field decoration_id integer?

---@class snowcap.widget.v1.GetWidgetEventsResponse
---@class snowcap.widget.v1.WidgetEvent
---@field widget_id integer?
---@field button snowcap.widget.v1.Button.Event?

---@class snowcap.widget.v1.GetWidgetEventsResponse
---@field widget_events snowcap.widget.v1.WidgetEvent[]?

---@class snowcap.decoration.v1.Bounds
---@field left integer?
---@field right integer?
Expand Down Expand Up @@ -1103,6 +1106,7 @@ snowcap.widget.v1.Button.Event = {}
snowcap.widget.v1.Image = {}
snowcap.widget.v1.Image.Rgba = {}
snowcap.widget.v1.GetWidgetEventsRequest = {}
snowcap.widget.v1.WidgetEvent = {}
snowcap.widget.v1.GetWidgetEventsResponse = {}
snowcap.decoration = {}
snowcap.decoration.v1 = {}
Expand Down
70 changes: 28 additions & 42 deletions snowcap/api/lua/snowcap/layer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -91,15 +91,7 @@ function layer.new_widget(args)

local widget_def = args.program:view()

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)
widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

---@type snowcap.layer.v1.NewLayerRequest
local request = {
Expand Down Expand Up @@ -129,48 +121,42 @@ function layer.new_widget(args)
local err = client:snowcap_widget_v1_WidgetService_GetWidgetEvents({
layer_id = layer_id,
}, function(response)
local widget_id = response.widget_id or 0
if response.button then
if callbacks[widget_id] then
args.program:update(callbacks[widget_id])
local widget_def = args.program:view()
callbacks = {}

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)

local _, err = client:snowcap_layer_v1_LayerService_UpdateLayer({
layer_id = layer_id,
widget_def = widget.widget_def_into_api(widget_def),
})
for _, event in ipairs(response.widget_events) do
local widget_id = event.widget_id or 0
local msg = nil

if event.button then
msg = callbacks[widget_id]
end

if msg then
local ok, update_err = pcall(function()
args.program:update(msg)
end)
if not ok then
log.error(update_err)
end
end
end

local widget_def = args.program:view()
callbacks = {}

widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

local _, err = client:snowcap_layer_v1_LayerService_UpdateLayer({
layer_id = layer_id,
widget_def = widget.widget_def_into_api(widget_def),
})
end)

return layer_handle.new(layer_id, function(msg)
pcall(function()
args.program:update(msg)
end)
args.program:update(msg)

local widget_def = args.program:view()
callbacks = {}

require("snowcap.widget")._traverse_widget_tree(
widget_def,
callbacks,
function(callbacks, widget)
if widget.button and widget.button.on_press then
callbacks[widget.button.widget_id] = widget.button.on_press
end
end
)
widget._traverse_widget_tree(widget_def, callbacks, widget._collect_callbacks)

local _, err = client:snowcap_layer_v1_LayerService_UpdateLayer({
layer_id = layer_id,
Expand Down
10 changes: 10 additions & 0 deletions snowcap/api/lua/snowcap/widget.lua
Original file line number Diff line number Diff line change
Expand Up @@ -578,4 +578,14 @@ function widget._traverse_widget_tree(wgt, callbacks, with_widget)
end
end

---@private
---@lcat nodoc
---@param callbacks any[]
---@param wgt snowcap.widget.WidgetDef
function widget._collect_callbacks(callbacks, wgt)
if wgt.button and wgt.button.on_press then
callbacks[wgt.button.widget_id] = wgt.button.on_press
end
end

return widget
6 changes: 5 additions & 1 deletion snowcap/api/protobuf/snowcap/widget/v1/widget.proto
Original file line number Diff line number Diff line change
Expand Up @@ -297,14 +297,18 @@ message GetWidgetEventsRequest {
}
}

message GetWidgetEventsResponse {
message WidgetEvent {
uint32 widget_id = 1;

oneof event {
Button.Event button = 2;
}
}

message GetWidgetEventsResponse {
repeated WidgetEvent widget_events = 1;
}

service WidgetService {
rpc GetWidgetEvents(GetWidgetEventsRequest) returns (stream GetWidgetEventsResponse);
}
39 changes: 22 additions & 17 deletions snowcap/api/rust/src/decoration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use snowcap_api_defs::snowcap::{
self,
v1::{CloseRequest, NewDecorationRequest, UpdateDecorationRequest},
},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, get_widget_events_response},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, widget_event},
};
use tokio::sync::mpsc::UnboundedSender;
use tokio_stream::StreamExt;
Expand Down Expand Up @@ -108,29 +108,34 @@ where

tokio::spawn(async move {
loop {
let msg = tokio::select! {
Some(Ok(event)) = event_stream.next() => {
let id = WidgetId(event.widget_id);
let Some(event) = event.event else {
continue;
};
match event {
get_widget_events_response::Event::Button(_event) => {
callbacks.get(&id).cloned()
}
tokio::select! {
Some(Ok(response)) = event_stream.next() => {
for widget_event in response.widget_events {
let id = WidgetId(widget_event.widget_id);
let Some(event) = widget_event.event else {
continue;
};

let msg = match event {
widget_event::Event::Button(_event) => {
callbacks.get(&id).cloned()
}
};

let Some(msg) = msg else {
continue;
};

program.update(msg.clone());
}

}
Some(msg) = msg_recv.recv() => {
Some(msg)
program.update(msg.clone());
}
else => break,
};

let Some(msg) = msg else {
continue;
};

program.update(msg.clone());
let widget_def = program.view();

callbacks.clear();
Expand Down
40 changes: 21 additions & 19 deletions snowcap/api/rust/src/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use snowcap_api_defs::snowcap::{
self,
v1::{CloseRequest, NewLayerRequest, UpdateLayerRequest},
},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, get_widget_events_response},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, widget_event},
};
use tokio::sync::mpsc::UnboundedSender;
use tokio_stream::StreamExt;
Expand Down Expand Up @@ -173,31 +173,33 @@ where

tokio::spawn(async move {
loop {
let msg = tokio::select! {
Some(Ok(event)) = event_stream.next() => {
let id = WidgetId(event.widget_id);
let Some(event) = event.event else {
continue;
};

match event {
get_widget_events_response::Event::Button(_event) => {
callbacks.get(&id).cloned()
}
tokio::select! {
Some(Ok(response)) = event_stream.next() => {
for widget_event in response.widget_events {
let id = WidgetId(widget_event.widget_id);
let Some(event) = widget_event.event else {
continue;
};

let msg = match event {
widget_event::Event::Button(_event) => {
callbacks.get(&id).cloned()
},
};

let Some(msg) = msg else {
continue;
};

program.update(msg.clone());
}
}
Some(msg) = msg_recv.recv() => {
Some(msg)
program.update(msg.clone());
}
else => break,
};

let Some(msg) = msg else {
continue;
};

program.update(msg.clone());

let widget_def = program.view();

callbacks.clear();
Expand Down
23 changes: 13 additions & 10 deletions snowcap/src/api/widget/v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use snowcap_api_defs::snowcap::widget::{
self,
v1::{
GetWidgetEventsRequest, GetWidgetEventsResponse, WidgetDef, get_widget_events_request,
widget_def, widget_service_server,
widget_def, widget_event, widget_service_server,
},
};
use tonic::{Request, Response, Status};
Expand Down Expand Up @@ -44,16 +44,19 @@ impl widget_service_server::WidgetService for super::WidgetService {
}
}
},
|(id, event)| {
|events| {
Ok(GetWidgetEventsResponse {
widget_id: id.into_inner(),
event: Some(match event {
WidgetEvent::Button => {
widget::v1::get_widget_events_response::Event::Button(
widget::v1::button::Event {},
)
}
}),
widget_events: events
.into_iter()
.map(|(id, event)| widget::v1::WidgetEvent {
widget_id: id.into_inner(),
event: Some(match event {
WidgetEvent::Button => {
widget_event::Event::Button(widget::v1::button::Event {})
}
}),
})
.collect(),
})
},
)
Expand Down
Loading
Loading