Skip to content
Open
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
48 changes: 48 additions & 0 deletions snowcap/api/lua/snowcap/grpc/defs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -887,6 +887,11 @@ local snowcap_layer_v1_Layer = {

---@class snowcap.decoration.v1.UpdateDecorationResponse

---@class snowcap.decoration.v1.ViewRequest
---@field decoration_id integer?

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

---@class snowcap.input.v0alpha1.Modifiers
---@field shift boolean?
---@field ctrl boolean?
Expand Down Expand Up @@ -1067,6 +1072,11 @@ local snowcap_layer_v1_Layer = {

---@class snowcap.layer.v1.UpdateLayerResponse

---@class snowcap.layer.v1.ViewRequest
---@field layer_id integer?

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

---@class snowcap.v0alpha1.Nothing

---@class snowcap.v1.Nothing
Expand Down Expand Up @@ -1117,6 +1127,8 @@ snowcap.decoration.v1.CloseRequest = {}
snowcap.decoration.v1.CloseResponse = {}
snowcap.decoration.v1.UpdateDecorationRequest = {}
snowcap.decoration.v1.UpdateDecorationResponse = {}
snowcap.decoration.v1.ViewRequest = {}
snowcap.decoration.v1.ViewResponse = {}
snowcap.input = {}
snowcap.input.v0alpha1 = {}
snowcap.input.v0alpha1.Modifiers = {}
Expand Down Expand Up @@ -1155,6 +1167,8 @@ snowcap.layer.v1.NewLayerResponse = {}
snowcap.layer.v1.CloseRequest = {}
snowcap.layer.v1.UpdateLayerRequest = {}
snowcap.layer.v1.UpdateLayerResponse = {}
snowcap.layer.v1.ViewRequest = {}
snowcap.layer.v1.ViewResponse = {}
snowcap.v0alpha1 = {}
snowcap.v0alpha1.Nothing = {}
snowcap.v1 = {}
Expand Down Expand Up @@ -1248,6 +1262,23 @@ snowcap.decoration.v1.DecorationService.UpdateDecoration.response = ".snowcap.de
function Client:snowcap_decoration_v1_DecorationService_UpdateDecoration(data)
return self:unary_request(snowcap.decoration.v1.DecorationService.UpdateDecoration, data)
end
snowcap.decoration.v1.DecorationService.RequestView = {}
snowcap.decoration.v1.DecorationService.RequestView.service = "snowcap.decoration.v1.DecorationService"
snowcap.decoration.v1.DecorationService.RequestView.method = "RequestView"
snowcap.decoration.v1.DecorationService.RequestView.request = ".snowcap.decoration.v1.ViewRequest"
snowcap.decoration.v1.DecorationService.RequestView.response = ".snowcap.decoration.v1.ViewResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.decoration.v1.ViewRequest
---
---@return snowcap.decoration.v1.ViewResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_decoration_v1_DecorationService_RequestView(data)
return self:unary_request(snowcap.decoration.v1.DecorationService.RequestView, data)
end
snowcap.input.v0alpha1.InputService = {}
snowcap.input.v0alpha1.InputService.KeyboardKey = {}
snowcap.input.v0alpha1.InputService.KeyboardKey.service = "snowcap.input.v0alpha1.InputService"
Expand Down Expand Up @@ -1413,6 +1444,23 @@ snowcap.layer.v1.LayerService.UpdateLayer.response = ".snowcap.layer.v1.UpdateLa
function Client:snowcap_layer_v1_LayerService_UpdateLayer(data)
return self:unary_request(snowcap.layer.v1.LayerService.UpdateLayer, data)
end
snowcap.layer.v1.LayerService.RequestView = {}
snowcap.layer.v1.LayerService.RequestView.service = "snowcap.layer.v1.LayerService"
snowcap.layer.v1.LayerService.RequestView.method = "RequestView"
snowcap.layer.v1.LayerService.RequestView.request = ".snowcap.layer.v1.ViewRequest"
snowcap.layer.v1.LayerService.RequestView.response = ".snowcap.layer.v1.ViewResponse"

---Performs a unary request.
---
---@nodiscard
---
---@param data snowcap.layer.v1.ViewRequest
---
---@return snowcap.layer.v1.ViewResponse | nil response
---@return string | nil error An error string, if any
function Client:snowcap_layer_v1_LayerService_RequestView(data)
return self:unary_request(snowcap.layer.v1.LayerService.RequestView, data)
end
return {
google = google,
snowcap = snowcap,
Expand Down
9 changes: 2 additions & 7 deletions snowcap/api/lua/snowcap/layer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -153,14 +153,9 @@ function layer.new_widget(args)
return layer_handle.new(layer_id, function(msg)
args.program:update(msg)

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({
---@diagnostic disable-next-line: redefined-local
local _, err = client:snowcap_layer_v1_LayerService_RequestView({
layer_id = layer_id,
widget_def = widget.widget_def_into_api(widget_def),
})

if err then
Expand Down
6 changes: 6 additions & 0 deletions snowcap/api/protobuf/snowcap/decoration/v1/decoration.proto
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,14 @@ message UpdateDecorationRequest {
}
message UpdateDecorationResponse {}

message ViewRequest {
uint32 decoration_id = 1;
}
message ViewResponse {}

service DecorationService {
rpc NewDecoration(NewDecorationRequest) returns (NewDecorationResponse);
rpc Close(CloseRequest) returns (CloseResponse);
rpc UpdateDecoration(UpdateDecorationRequest) returns (UpdateDecorationResponse);
rpc RequestView(ViewRequest) returns (ViewResponse);
}
6 changes: 6 additions & 0 deletions snowcap/api/protobuf/snowcap/layer/v1/layer.proto
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,14 @@ message UpdateLayerRequest {
}
message UpdateLayerResponse {}

message ViewRequest {
uint32 layer_id = 1;
}
message ViewResponse {}

service LayerService {
rpc NewLayer(NewLayerRequest) returns (NewLayerResponse);
rpc Close(CloseRequest) returns (google.protobuf.Empty);
rpc UpdateLayer(UpdateLayerRequest) returns (UpdateLayerResponse);
rpc RequestView(ViewRequest) returns (ViewResponse);
}
10 changes: 9 additions & 1 deletion snowcap/api/rust/src/decoration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use std::collections::HashMap;
use snowcap_api_defs::snowcap::{
decoration::{
self,
v1::{CloseRequest, NewDecorationRequest, UpdateDecorationRequest},
v1::{CloseRequest, NewDecorationRequest, UpdateDecorationRequest, ViewRequest},
},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, widget_event},
};
Expand Down Expand Up @@ -132,6 +132,14 @@ where
}
Some(msg) = msg_recv.recv() => {
program.update(msg.clone());

if let Err(status) = Client::decoration()
.request_view(ViewRequest { decoration_id })
.block_on_tokio()
{
error!("Failed to request view for {decoration_id}: {status}")
}
continue;
}
else => break,
};
Expand Down
13 changes: 11 additions & 2 deletions snowcap/api/rust/src/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use snowcap_api_defs::snowcap::{
input::v1::KeyboardKeyRequest,
layer::{
self,
v1::{CloseRequest, NewLayerRequest, UpdateLayerRequest},
v1::{CloseRequest, NewLayerRequest, UpdateLayerRequest, ViewRequest},
},
widget::v1::{GetWidgetEventsRequest, get_widget_events_request, widget_event},
};
Expand Down Expand Up @@ -195,7 +195,16 @@ where
}
}
Some(msg) = msg_recv.recv() => {
program.update(msg.clone());
program.update(msg);

if let Err(status) = Client::layer()
.request_view(ViewRequest { layer_id })
.block_on_tokio()
{
error!("Failed to request view for {layer_id}: {status}");
}

continue;
}
else => break,
};
Expand Down
29 changes: 28 additions & 1 deletion snowcap/src/api/decoration/v1.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use snowcap_api_defs::snowcap::decoration::v1::{
CloseRequest, CloseResponse, NewDecorationRequest, NewDecorationResponse,
UpdateDecorationRequest, UpdateDecorationResponse, decoration_service_server,
UpdateDecorationRequest, UpdateDecorationResponse, ViewRequest, ViewResponse,
decoration_service_server,
};
use tonic::{Request, Response, Status};
use tracing::warn;
Expand Down Expand Up @@ -125,4 +126,30 @@ impl decoration_service_server::DecorationService for super::DecorationService {
})
.await
}

async fn request_view(
&self,
request: Request<ViewRequest>,
) -> Result<Response<ViewResponse>, Status> {
let request = request.into_inner();

let id = request.decoration_id;
let id = DecorationId(id);

run_unary(&self.sender, move |state| {
let Some(deco) = state
.decorations
.iter_mut()
.find(|deco| deco.decoration_id == id)
else {
return Ok(ViewResponse {});
};

deco.request_view();
deco.schedule_redraw();

Ok(ViewResponse {})
})
.await
}
}
24 changes: 23 additions & 1 deletion snowcap/src/api/layer/v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use snowcap_api_defs::snowcap::layer::{
self,
v1::{
CloseRequest, NewLayerRequest, NewLayerResponse, UpdateLayerRequest, UpdateLayerResponse,
layer_service_server,
ViewRequest, ViewResponse, layer_service_server,
},
};
use tonic::{Request, Response, Status};
Expand Down Expand Up @@ -177,4 +177,26 @@ impl layer_service_server::LayerService for super::LayerService {
})
.await
}

async fn request_view(
&self,
request: Request<ViewRequest>,
) -> Result<Response<ViewResponse>, Status> {
let request = request.into_inner();

let id = request.layer_id;
let id = LayerId(id);

run_unary(&self.sender, move |state| {
let Some(layer) = state.layers.iter_mut().find(|layer| layer.layer_id == id) else {
return Ok(ViewResponse {});
};

layer.request_view();
layer.schedule_redraw();

Ok(ViewResponse {})
})
.await
}
}
4 changes: 4 additions & 0 deletions snowcap/src/decoration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ impl SnowcapDecoration {
})
}

pub fn request_view(&mut self) {
self.surface.request_view();
}

pub fn schedule_redraw(&mut self) {
self.surface.schedule_redraw();
}
Expand Down
4 changes: 4 additions & 0 deletions snowcap/src/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ impl SnowcapLayer {
}
}

pub fn request_view(&mut self) {
self.surface.request_view();
}

pub fn schedule_redraw(&mut self) {
self.surface.schedule_redraw();
}
Expand Down
9 changes: 8 additions & 1 deletion snowcap/src/surface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ pub struct SnowcapSurface {

redraw_scheduled: bool,
pending_view: Option<ViewFn>,
view_requested: bool,
waiting_view: bool,
pub widgets: SnowcapWidgetProgram,
clipboard: WaylandClipboard,
Expand Down Expand Up @@ -135,6 +136,7 @@ impl SnowcapSurface {
bounds: iced::Size::default(),
pending_bounds: None,
pending_view: None,
view_requested: false,
waiting_view: false,
widgets,
renderer,
Expand All @@ -160,6 +162,10 @@ impl SnowcapSurface {
self.pending_view = Some(new_view);
}

pub fn request_view(&mut self) {
self.view_requested = true;
}

pub fn schedule_redraw(&mut self) {
if self.redraw_scheduled {
return;
Expand Down Expand Up @@ -333,7 +339,7 @@ impl SnowcapSurface {
});
}

if !messages.is_empty()
if (!messages.is_empty() || self.view_requested)
&& let Some(sender) = self.widget_event_sender.as_ref()
{
let widget_events: Vec<_> = messages
Expand All @@ -347,6 +353,7 @@ impl SnowcapSurface {
})
.collect();

self.view_requested = false;
self.waiting_view = true;
let _ = sender.send(widget_events);
}
Expand Down
Loading