Skip to content
Draft
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
4 changes: 3 additions & 1 deletion api/lua/pinnacle/output.lua
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ end
local signal_name_to_SignalName = {
connect = "OutputConnect",
disconnect = "OutputDisconnect",
setup = "OutputSetup",
resize = "OutputResize",
move = "OutputMove",
pointer_enter = "OutputPointerEnter",
Expand All @@ -148,8 +149,9 @@ local signal_name_to_SignalName = {
}

---@class pinnacle.output.OutputSignal Signals related to output events.
---@field connect fun(output: pinnacle.output.OutputHandle)? An output was connected. FIXME: This currently does not fire for outputs that have been previously connected and disconnected.
---@field connect fun(output: pinnacle.output.OutputHandle)? An output was connected.
---@field disconnect fun(output: pinnacle.output.OutputHandle)? An output was disconnected.
---@field setup fun(output: pinnacle.output.OutputHandle)? An output was connected for the first time.
---@field resize fun(output: pinnacle.output.OutputHandle, logical_width: integer, logical_height: integer)? An output's logical size changed.
---@field move fun(output: pinnacle.output.OutputHandle, x: integer, y: integer)? An output moved.
---@field pointer_enter fun(output: pinnacle.output.OutputHandle)? The pointer entered an output.
Expand Down
18 changes: 18 additions & 0 deletions api/lua/pinnacle/signal.lua
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@ local signals = {
---@type fun(response: table)
on_response = nil,
},
OutputSetup = {
---@type grpc_client.h2.Stream?
sender = nil,
---@type { callback_id: integer, callback: fun(output: pinnacle.output.OutputHandle) }[]
callbacks = {},
---@type fun(response: table)
on_response = nil,
},
OutputResize = {
---@type grpc_client.h2.Stream?
sender = nil,
Expand Down Expand Up @@ -169,6 +177,16 @@ signals.OutputDisconnect.on_response = function(response)
end
end

signals.OutputSetup.on_response = function(response)
---@diagnostic disable-next-line: invisible
local handle = require("pinnacle.output").handle.new(response.output_name)
local callbacks = require("pinnacle.util").deep_copy(signals.OutputSetup.callbacks)

for _, callback in ipairs(callbacks) do
protected_callback("OutputSetup", callback.callback, handle)
end
end

signals.OutputResize.on_response = function(response)
---@diagnostic disable-next-line: invisible
local handle = require("pinnacle.output").handle.new(response.output_name)
Expand Down
8 changes: 8 additions & 0 deletions api/protobuf/pinnacle/signal/v1/signal.proto
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ message OutputDisconnectResponse {
string output_name = 1;
}

message OutputSetupRequest {
StreamControl control = 1;
}
message OutputSetupResponse {
string output_name = 1;
}

message OutputResizeRequest {
StreamControl control = 1;
}
Expand Down Expand Up @@ -117,6 +124,7 @@ message InputDeviceAddedResponse {
service SignalService {
rpc OutputConnect(stream OutputConnectRequest) returns (stream OutputConnectResponse);
rpc OutputDisconnect(stream OutputDisconnectRequest) returns (stream OutputDisconnectResponse);
rpc OutputSetup(stream OutputSetupRequest) returns (stream OutputSetupResponse);
rpc OutputResize(stream OutputResizeRequest) returns (stream OutputResizeResponse);
rpc OutputMove(stream OutputMoveRequest) returns (stream OutputMoveResponse);
rpc OutputPointerEnter(stream OutputPointerEnterRequest) returns (stream OutputPointerEnterResponse);
Expand Down
1 change: 1 addition & 0 deletions api/rust/src/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ pub fn connect_signal(signal: OutputSignal) -> SignalHandle {
match signal {
OutputSignal::Connect(f) => signal_state.output_connect.add_callback(f),
OutputSignal::Disconnect(f) => signal_state.output_disconnect.add_callback(f),
OutputSignal::Setup(f) => signal_state.output_setup.add_callback(f),
OutputSignal::Resize(f) => signal_state.output_resize.add_callback(f),
OutputSignal::Move(f) => signal_state.output_move.add_callback(f),
OutputSignal::PointerEnter(f) => signal_state.output_pointer_enter.add_callback(f),
Expand Down
24 changes: 20 additions & 4 deletions api/rust/src/signal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,6 @@ signals! {
/// An output was connected.
///
/// Callbacks receive the newly connected output.
///
/// FIXME: This will not run on outputs that have been previously connected.
/// | Tell the dev to fix this in the compositor.
OutputConnect = {
enum_name = Connect,
callback_type = SingleOutputFn,
Expand All @@ -140,7 +137,7 @@ signals! {
}
},
}
/// An output was connected.
/// An output was disconnected.
///
/// Callbacks receive the disconnected output.
OutputDisconnect = {
Expand All @@ -155,6 +152,22 @@ signals! {
}
},
}
/// An output was connected for the first time.
/// This will not trigger if the output was previously connected.
///
/// Callbacks receive the newly connected output.
OutputSetup = {
enum_name = Setup,
callback_type = SingleOutputFn,
client_request = output_setup,
on_response = |response, callbacks| {
let handle = OutputHandle { name: response.output_name };

for callback in callbacks {
callback(&handle);
}
},
}
/// An output's logical size changed.
///
/// Callbacks receive the output and new width and height.
Expand Down Expand Up @@ -335,6 +348,7 @@ pub(crate) type SingleWindowFn = Box<dyn FnMut(&WindowHandle) + Send + 'static>;
pub(crate) struct SignalState {
pub(crate) output_connect: SignalData<OutputConnect>,
pub(crate) output_disconnect: SignalData<OutputDisconnect>,
pub(crate) output_setup: SignalData<OutputSetup>,
pub(crate) output_resize: SignalData<OutputResize>,
pub(crate) output_move: SignalData<OutputMove>,
pub(crate) output_pointer_enter: SignalData<OutputPointerEnter>,
Expand Down Expand Up @@ -362,6 +376,7 @@ impl SignalState {
Self {
output_connect: SignalData::new(),
output_disconnect: SignalData::new(),
output_setup: SignalData::new(),
output_resize: SignalData::new(),
output_move: SignalData::new(),
output_pointer_enter: SignalData::new(),
Expand All @@ -382,6 +397,7 @@ impl SignalState {
pub(crate) fn shutdown(&mut self) {
self.output_connect.reset();
self.output_disconnect.reset();
self.output_setup.reset();
self.output_resize.reset();
self.output_move.reset();
self.output_pointer_enter.reset();
Expand Down
1 change: 1 addition & 0 deletions pinnacle-api-defs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ pub mod pinnacle {
impl_signal_request!(
OutputConnectRequest,
OutputDisconnectRequest,
OutputSetupRequest,
OutputResizeRequest,
OutputMoveRequest,
OutputPointerEnterRequest,
Expand Down
44 changes: 39 additions & 5 deletions src/api/signal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ use pinnacle_api_defs::pinnacle::signal::{
OutputConnectResponse, OutputDisconnectRequest, OutputDisconnectResponse,
OutputFocusedRequest, OutputFocusedResponse, OutputMoveRequest, OutputMoveResponse,
OutputPointerEnterRequest, OutputPointerEnterResponse, OutputPointerLeaveRequest,
OutputPointerLeaveResponse, OutputResizeRequest, OutputResizeResponse, SignalRequest,
StreamControl, TagActiveRequest, TagActiveResponse, WindowFocusedRequest,
WindowFocusedResponse, WindowPointerEnterRequest, WindowPointerEnterResponse,
WindowPointerLeaveRequest, WindowPointerLeaveResponse, WindowTitleChangedRequest,
WindowTitleChangedResponse,
OutputPointerLeaveResponse, OutputResizeRequest, OutputResizeResponse, OutputSetupRequest,
OutputSetupResponse, SignalRequest, StreamControl, TagActiveRequest, TagActiveResponse,
WindowFocusedRequest, WindowFocusedResponse, WindowPointerEnterRequest,
WindowPointerEnterResponse, WindowPointerLeaveRequest, WindowPointerLeaveResponse,
WindowTitleChangedRequest, WindowTitleChangedResponse,
},
};
use smithay::output::Output;
Expand All @@ -35,6 +35,7 @@ pub struct SignalState {
// Output
pub output_connect: OutputConnect,
pub output_disconnect: OutputDisconnect,
pub output_setup: OutputSetup,
pub output_resize: OutputResize,
pub output_move: OutputMove,
pub output_pointer_enter: OutputPointerEnter,
Expand Down Expand Up @@ -136,6 +137,27 @@ impl Signal for OutputDisconnect {
}
}

#[derive(Debug, Default)]
pub struct OutputSetup {
v1: SignalData<signal::v1::OutputSetupResponse>,
}

impl Signal for OutputSetup {
type Args<'a> = &'a smithay::output::Output;

fn signal(&mut self, args: Self::Args<'_>) {
self.v1.signal(|buf| {
buf.push_back(signal::v1::OutputSetupResponse {
output_name: args.name(),
});
});
}

fn clear(&mut self) {
self.v1.instances.clear();
}
}

#[derive(Debug, Default)]
pub struct OutputResize {
v1: SignalData<signal::v1::OutputResizeResponse>,
Expand Down Expand Up @@ -482,6 +504,7 @@ impl SignalService {
impl signal::v1::signal_service_server::SignalService for SignalService {
type OutputConnectStream = ResponseStream<OutputConnectResponse>;
type OutputDisconnectStream = ResponseStream<OutputDisconnectResponse>;
type OutputSetupStream = ResponseStream<OutputSetupResponse>;
type OutputResizeStream = ResponseStream<OutputResizeResponse>;
type OutputMoveStream = ResponseStream<OutputMoveResponse>;
type OutputPointerEnterStream = ResponseStream<OutputPointerEnterResponse>;
Expand Down Expand Up @@ -519,6 +542,17 @@ impl signal::v1::signal_service_server::SignalService for SignalService {
})
}

async fn output_setup(
&self,
request: Request<Streaming<OutputSetupRequest>>,
) -> Result<Response<Self::OutputSetupStream>, Status> {
let in_stream = request.into_inner();

start_signal_stream(self.sender.clone(), in_stream, |state| {
&mut state.pinnacle.signal_state.output_setup.v1
})
}

async fn output_resize(
&self,
request: Request<Streaming<OutputResizeRequest>>,
Expand Down
4 changes: 3 additions & 1 deletion src/backend/udev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1069,9 +1069,11 @@ impl Udev {
output.with_state_mut(|state| state.tags.clone_from(tags));
pinnacle.change_output_state(self, &output, None, None, *scale, Some(*loc));
} else {
pinnacle.signal_state.output_connect.signal(&output);
pinnacle.signal_state.output_setup.signal(&output);
}

pinnacle.signal_state.output_connect.signal(&output);

pinnacle.output_management_manager_state.update::<State>();
}

Expand Down
12 changes: 3 additions & 9 deletions src/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,24 +308,18 @@ impl Pinnacle {
self.space.map_output(output, output.current_location());

// Trigger the connect signal here for configs to reposition outputs
//
// TODO: Create a new output_disable/enable signal and trigger it here
// instead of connect and disconnect
if should_signal {
self.signal_state.output_connect.signal(output);
}
} else {
if let Some(global) = output.with_state_mut(|state| state.enabled_global_id.take()) {
self.display_handle.remove_global::<State>(global);

// Trigger the disconnect signal here for configs to reposition outputs
self.signal_state.output_disconnect.signal(output);
}
self.space.unmap_output(output);

// Trigger the disconnect signal here for configs to reposition outputs
//
// TODO: Create a new output_disable/enable signal and trigger it here
// instead of connect and disconnect
self.signal_state.output_disconnect.signal(output);

self.gamma_control_manager_state.output_removed(output);

self.config.connector_saved_states.insert(
Expand Down
Loading