Fix build on wayland and no display backend

This commit is contained in:
elkowar 2021-07-23 15:19:16 +02:00
parent cff2f6beb8
commit 186c284a1a
No known key found for this signature in database
GPG key ID: E321AD71B1D1F27F
4 changed files with 118 additions and 98 deletions

View file

@ -348,6 +348,7 @@ fn initialize_window(
} }
/// Apply the provided window-positioning rules to the window. /// Apply the provided window-positioning rules to the window.
#[cfg(feature = "x11")]
fn apply_window_position( fn apply_window_position(
mut window_geometry: WindowGeometry, mut window_geometry: WindowGeometry,
monitor_geometry: gdk::Rectangle, monitor_geometry: gdk::Rectangle,

View file

@ -2,27 +2,27 @@ pub use platform::*;
#[cfg(feature = "no-x11-wayland")] #[cfg(feature = "no-x11-wayland")]
mod platform { mod platform {
use crate::config::{EwwWindowDefinition, StrutDefinition, WindowStacking}; use crate::config::EwwWindowDefinition;
use anyhow::*;
use gtk::{self, prelude::*};
pub fn initialize_window(window_def: &EwwWindowDefinition, _monitor: gdk::Rectangle) -> Option<gtk::Window> { pub fn initialize_window(_window_def: &EwwWindowDefinition, _monitor: gdk::Rectangle) -> Option<gtk::Window> {
Some(gtk::Window::new(gtk::WindowType::Toplevel)) Some(gtk::Window::new(gtk::WindowType::Toplevel))
} }
} }
#[cfg(feature = "wayland")] #[cfg(feature = "wayland")]
mod platform { mod platform {
use crate::config::{AnchorAlignment, EwwWindowDefinition, WindowStacking};
use gdk; use gdk;
use gtk::prelude::*; use gtk::prelude::*;
use yuck::config::{window_definition::WindowStacking, window_geometry::AnchorAlignment};
use crate::config::EwwWindowDefinition;
pub fn initialize_window(window_def: &EwwWindowDefinition, monitor: gdk::Rectangle) -> Option<gtk::Window> { pub fn initialize_window(window_def: &EwwWindowDefinition, monitor: gdk::Rectangle) -> Option<gtk::Window> {
let window = gtk::Window::new(gtk::WindowType::Toplevel); let window = gtk::Window::new(gtk::WindowType::Toplevel);
// Initialising a layer shell surface // Initialising a layer shell surface
gtk_layer_shell::init_for_window(&window); gtk_layer_shell::init_for_window(&window);
// Sets the monitor where the surface is shown // Sets the monitor where the surface is shown
match window_def.screen_number { match window_def.monitor_number {
Some(index) => { Some(index) => {
if let Some(monitor) = gdk::Display::get_default().expect("could not get default display").get_monitor(index) { if let Some(monitor) = gdk::Display::get_default().expect("could not get default display").get_monitor(index) {
gtk_layer_shell::set_monitor(&window, &monitor); gtk_layer_shell::set_monitor(&window, &monitor);

View file

@ -6,6 +6,12 @@ edition = "2018"
build = "build.rs" build = "build.rs"
[features]
default = ["x11"]
x11 = []
wayland = []
no-x11-wayland = []
[dependencies] [dependencies]
lalrpop-util = "0.19.5" lalrpop-util = "0.19.5"
regex = "1" regex = "1"

View file

@ -12,21 +12,25 @@ use eww_shared_util::Span;
use super::{attributes::Attributes, window_definition::EnumParseError}; use super::{attributes::Attributes, window_definition::EnumParseError};
pub type BackendWindowOptions = X11WindowOptions; pub use backend::*;
#[cfg(feature = "x11")]
mod backend {
use super::*;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct X11WindowOptions { pub struct BackendWindowOptions {
pub wm_ignore: bool, pub wm_ignore: bool,
pub sticky: bool, pub sticky: bool,
pub window_type: WindowType, pub window_type: WindowType,
pub struts: StrutDefinition, pub struts: StrutDefinition,
} }
impl X11WindowOptions { impl BackendWindowOptions {
pub fn from_attrs(attrs: &mut Attributes) -> AstResult<Self> { pub fn from_attrs(attrs: &mut Attributes) -> AstResult<Self> {
let struts = attrs.ast_optional("reserve")?; let struts = attrs.ast_optional("reserve")?;
let window_type = attrs.primitive_optional("windowtype")?; let window_type = attrs.primitive_optional("windowtype")?;
Ok(X11WindowOptions { Ok(Self {
wm_ignore: attrs.primitive_optional("wm-ignore")?.unwrap_or(window_type.is_none() && struts.is_none()), wm_ignore: attrs.primitive_optional("wm-ignore")?.unwrap_or(window_type.is_none() && struts.is_none()),
window_type: window_type.unwrap_or_default(), window_type: window_type.unwrap_or_default(),
sticky: attrs.primitive_optional("sticky")?.unwrap_or(true), sticky: attrs.primitive_optional("sticky")?.unwrap_or(true),
@ -97,25 +101,34 @@ impl FromAstElementContent for StrutDefinition {
Ok(StrutDefinition { side: attrs.primitive_required("side")?, dist: attrs.primitive_required("distance")? }) Ok(StrutDefinition { side: attrs.primitive_required("side")?, dist: attrs.primitive_required("distance")? })
} }
} }
}
#[cfg(feature = "wayland")]
mod backend {
use super::*;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct WaylandWindowOptions { pub struct BackendWindowOptions {
pub exclusive: bool, pub exclusive: bool,
pub focusable: bool, pub focusable: bool,
} }
impl WaylandWindowOptions { impl BackendWindowOptions {
pub fn from_attrs(attrs: &mut Attributes) -> AstResult<Self> { pub fn from_attrs(attrs: &mut Attributes) -> AstResult<Self> {
Ok(WaylandWindowOptions { Ok(Self {
exclusive: attrs.primitive_optional("exclusive")?.unwrap_or(false), exclusive: attrs.primitive_optional("exclusive")?.unwrap_or(false),
focusable: attrs.primitive_optional("focusable")?.unwrap_or(false), focusable: attrs.primitive_optional("focusable")?.unwrap_or(false),
}) })
} }
} }
}
#[cfg(feature = "no-x11-wayland")]
mod backend {
use super::*;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)] #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct NoBackendWindowOptions; pub struct BackendWindowOptions;
impl NoBackendWindowOptions { impl BackendWindowOptions {
pub fn from_attrs(attrs: &mut Attributes) -> Result<Self> { pub fn from_attrs(attrs: &mut Attributes) -> AstResult<Self> {
Ok(NoBackendWindowOptions) Ok(Self)
}
} }
} }