deps: Update smithay
Integrate new multigpu allocator code for gpu->gpu copies using the vulkan allocator. Also integrates Xwayland clipboard sync.
This commit is contained in:
parent
32762fb983
commit
4a9dfcead0
11 changed files with 450 additions and 115 deletions
|
|
@ -7,10 +7,12 @@ use smithay::{
|
|||
reexports::wayland_server::protocol::{wl_data_source::WlDataSource, wl_surface::WlSurface},
|
||||
utils::IsAlive,
|
||||
wayland::data_device::{
|
||||
ClientDndGrabHandler, DataDeviceHandler, DataDeviceState, ServerDndGrabHandler,
|
||||
with_source_metadata, ClientDndGrabHandler, DataDeviceHandler, DataDeviceState,
|
||||
ServerDndGrabHandler,
|
||||
},
|
||||
xwayland::xwm::{SelectionType, XwmId},
|
||||
};
|
||||
use std::cell::RefCell;
|
||||
use std::{cell::RefCell, os::unix::io::OwnedFd};
|
||||
|
||||
pub struct DnDIcon {
|
||||
surface: RefCell<Option<WlSurface>>,
|
||||
|
|
@ -48,9 +50,54 @@ impl ClientDndGrabHandler for State {
|
|||
}
|
||||
impl ServerDndGrabHandler for State {}
|
||||
impl DataDeviceHandler for State {
|
||||
type SelectionUserData = XwmId;
|
||||
|
||||
fn data_device_state(&self) -> &DataDeviceState {
|
||||
&self.common.data_device_state
|
||||
}
|
||||
|
||||
fn new_selection(&mut self, source: Option<WlDataSource>) {
|
||||
for xstate in self.common.xwayland_state.values_mut() {
|
||||
if let Some(xwm) = xstate.xwm.as_mut() {
|
||||
if let Some(source) = &source {
|
||||
if let Ok(Err(err)) = with_source_metadata(source, |metadata| {
|
||||
xwm.new_selection(
|
||||
SelectionType::Clipboard,
|
||||
Some(metadata.mime_types.clone()),
|
||||
)
|
||||
}) {
|
||||
slog_scope::warn!("Failed to set Xwayland clipboard selection: {}", err);
|
||||
}
|
||||
} else if let Err(err) = xwm.new_selection(SelectionType::Clipboard, None) {
|
||||
slog_scope::warn!("Failed to clear Xwayland clipboard selection: {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn send_selection(
|
||||
&mut self,
|
||||
mime_type: String,
|
||||
fd: OwnedFd,
|
||||
user_data: &Self::SelectionUserData,
|
||||
) {
|
||||
if let Some(xwm) = self
|
||||
.common
|
||||
.xwayland_state
|
||||
.values_mut()
|
||||
.flat_map(|xstate| xstate.xwm.as_mut())
|
||||
.find(|xwm| &xwm.id() == user_data)
|
||||
{
|
||||
if let Err(err) = xwm.send_selection(
|
||||
SelectionType::Clipboard,
|
||||
mime_type,
|
||||
fd,
|
||||
self.common.event_loop_handle.clone(),
|
||||
) {
|
||||
slog_scope::warn!("Failed to send clipboard (X11 -> Wayland): {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delegate_data_device!(State);
|
||||
|
|
|
|||
|
|
@ -3,13 +3,57 @@
|
|||
use crate::state::State;
|
||||
use smithay::{
|
||||
delegate_primary_selection,
|
||||
wayland::primary_selection::{PrimarySelectionHandler, PrimarySelectionState},
|
||||
wayland::primary_selection::{PrimarySelectionHandler, PrimarySelectionState, with_source_metadata}, xwayland::xwm::{XwmId, SelectionType}, reexports::wayland_protocols::wp::primary_selection::zv1::server::zwp_primary_selection_source_v1::ZwpPrimarySelectionSourceV1,
|
||||
};
|
||||
|
||||
use std::os::unix::io::OwnedFd;
|
||||
|
||||
impl PrimarySelectionHandler for State {
|
||||
type SelectionUserData = XwmId;
|
||||
|
||||
fn primary_selection_state(&self) -> &PrimarySelectionState {
|
||||
&self.common.primary_selection_state
|
||||
}
|
||||
|
||||
fn new_selection(&mut self, source: Option<ZwpPrimarySelectionSourceV1>) {
|
||||
for xstate in self.common.xwayland_state.values_mut() {
|
||||
if let Some(xwm) = xstate.xwm.as_mut() {
|
||||
if let Some(source) = &source {
|
||||
if let Ok(Err(err)) = with_source_metadata(source, |metadata| {
|
||||
xwm.new_selection(SelectionType::Primary, Some(metadata.mime_types.clone()))
|
||||
}) {
|
||||
slog_scope::warn!("Failed to set Xwayland primary selection: {}", err);
|
||||
}
|
||||
} else if let Err(err) = xwm.new_selection(SelectionType::Primary, None) {
|
||||
slog_scope::warn!("Failed to clear Xwayland primary selection: {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn send_selection(
|
||||
&mut self,
|
||||
mime_type: String,
|
||||
fd: OwnedFd,
|
||||
user_data: &Self::SelectionUserData,
|
||||
) {
|
||||
if let Some(xwm) = self
|
||||
.common
|
||||
.xwayland_state
|
||||
.values_mut()
|
||||
.flat_map(|xstate| xstate.xwm.as_mut())
|
||||
.find(|xwm| &xwm.id() == user_data)
|
||||
{
|
||||
if let Err(err) = xwm.send_selection(
|
||||
SelectionType::Primary,
|
||||
mime_type,
|
||||
fd,
|
||||
self.common.event_loop_handle.clone(),
|
||||
) {
|
||||
slog_scope::warn!("Failed to send primary selection (X11 -> Wayland): {}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
delegate_primary_selection!(State);
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ impl ScreencopyHandler for State {
|
|||
None
|
||||
})
|
||||
.unwrap_or(kms.primary.clone());
|
||||
_kms_renderer = Some(kms.api.renderer::<Gles2Renderbuffer>(&node, &node).unwrap());
|
||||
_kms_renderer = Some(kms.api.single_renderer(&node).unwrap());
|
||||
_kms_renderer.as_mut().unwrap().as_mut()
|
||||
}
|
||||
BackendData::Winit(ref mut winit) => winit.backend.renderer(),
|
||||
|
|
@ -423,7 +423,7 @@ fn formats_for_output(
|
|||
let renderer = match backend {
|
||||
BackendData::Kms(ref mut kms) => {
|
||||
let node = kms.target_node_for_output(&output).unwrap_or(kms.primary);
|
||||
_kms_renderer = Some(kms.api.renderer::<Gles2Renderbuffer>(&node, &node).unwrap());
|
||||
_kms_renderer = Some(kms.api.single_renderer(&node).unwrap());
|
||||
_kms_renderer.as_mut().unwrap().as_mut()
|
||||
}
|
||||
BackendData::Winit(ref mut winit) => winit.backend.renderer(),
|
||||
|
|
@ -664,7 +664,7 @@ pub fn render_output_to_buffer(
|
|||
BackendData::Kms(kms) => {
|
||||
let mut multirenderer = kms
|
||||
.api
|
||||
.renderer::<Gles2Renderbuffer>(node.as_ref().unwrap(), node.as_ref().unwrap())
|
||||
.single_renderer(node.as_ref().unwrap())
|
||||
.map_err(|err| (FailureReason::Unspec, err.into()))?;
|
||||
render_session::<_, _>(
|
||||
node,
|
||||
|
|
@ -794,7 +794,7 @@ pub fn render_workspace_to_buffer(
|
|||
BackendData::Kms(kms) => {
|
||||
let mut multirenderer = kms
|
||||
.api
|
||||
.renderer::<Gles2Renderbuffer>(node.as_ref().unwrap(), node.as_ref().unwrap())
|
||||
.single_renderer(node.as_ref().unwrap())
|
||||
.map_err(|err| (FailureReason::Unspec, err.into()))?;
|
||||
render_session::<_, _>(
|
||||
node,
|
||||
|
|
@ -959,7 +959,7 @@ pub fn render_window_to_buffer(
|
|||
BackendData::Kms(kms) => {
|
||||
let mut multirenderer = kms
|
||||
.api
|
||||
.renderer::<Gles2Renderbuffer>(node.as_ref().unwrap(), node.as_ref().unwrap())
|
||||
.single_renderer(node.as_ref().unwrap())
|
||||
.map_err(|err| (FailureReason::Unspec, err.into()))?;
|
||||
render_session::<_, _>(
|
||||
node,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue