prototype decor (only for xwayland rn)
This commit is contained in:
parent
d78c792f05
commit
db49a29fad
7 changed files with 426 additions and 32 deletions
143
Cargo.lock
generated
143
Cargo.lock
generated
|
|
@ -234,6 +234,29 @@ version = "1.12.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
|
checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cairo-rs"
|
||||||
|
version = "0.22.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5cc8d9aa793480744cd9a0524fef1a2e197d9eaa0f739cde19d16aba530dcb95"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.13.0",
|
||||||
|
"cairo-sys-rs",
|
||||||
|
"glib",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cairo-sys-rs"
|
||||||
|
version = "0.22.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f8b4985713047f5faee02b8db6a6ef32bbb50269ff53c1aee716d1d195b76d54"
|
||||||
|
dependencies = [
|
||||||
|
"glib-sys",
|
||||||
|
"libc",
|
||||||
|
"system-deps",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "calloop"
|
name = "calloop"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
|
|
@ -303,6 +326,16 @@ version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-expr"
|
||||||
|
version = "0.20.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "fb693542bcafa528e198be0ebd9d3632ca5b7c93dbe7237460e199910835997c"
|
||||||
|
dependencies = [
|
||||||
|
"smallvec",
|
||||||
|
"target-lexicon",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.4"
|
version = "1.0.4"
|
||||||
|
|
@ -763,12 +796,66 @@ dependencies = [
|
||||||
"xml-rs",
|
"xml-rs",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glib"
|
||||||
|
version = "0.22.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ddbcf514bd1881fc1b960e4e52b4e82873f4da3bceddbd58d42827b508888100"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.13.0",
|
||||||
|
"glib-macros",
|
||||||
|
"glib-sys",
|
||||||
|
"gobject-sys",
|
||||||
|
"libc",
|
||||||
|
"memchr",
|
||||||
|
"smallvec",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glib-macros"
|
||||||
|
version = "0.22.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "506d23499707c7142898429757e8d9a3871d965239a2cb66dfa05052be6d6f19"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glib-sys"
|
||||||
|
version = "0.22.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "030967459f9f676851872c6304adea7825c6d462ec9b72554c733cf0c5952233"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"system-deps",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gobject-sys"
|
||||||
|
version = "0.22.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "22a861859b887a79cf461359c192c97a57d8fb0229dd291232e57aa11f6fa72c"
|
||||||
|
dependencies = [
|
||||||
|
"glib-sys",
|
||||||
|
"libc",
|
||||||
|
"system-deps",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.17.1"
|
version = "0.17.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "heck"
|
||||||
|
version = "0.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hermit-abi"
|
name = "hermit-abi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
|
|
@ -1072,6 +1159,7 @@ name = "milkyway"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.13.0",
|
"bitflags 2.13.0",
|
||||||
|
"cairo-rs",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"rodio",
|
"rodio",
|
||||||
"smithay",
|
"smithay",
|
||||||
|
|
@ -1982,6 +2070,15 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
|
||||||
|
dependencies = [
|
||||||
|
"serde_core",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sha2"
|
name = "sha2"
|
||||||
version = "0.10.9"
|
version = "0.10.9"
|
||||||
|
|
@ -2323,6 +2420,25 @@ dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "system-deps"
|
||||||
|
version = "7.0.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "396a35feb67335377e0251fcbc1092fc85c484bd4e3a7a54319399da127796e7"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-expr",
|
||||||
|
"heck",
|
||||||
|
"pkg-config",
|
||||||
|
"toml",
|
||||||
|
"version-compare",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "target-lexicon"
|
||||||
|
version = "0.13.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.27.0"
|
version = "3.27.0"
|
||||||
|
|
@ -2410,6 +2526,21 @@ dependencies = [
|
||||||
"strict-num",
|
"strict-num",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "1.1.2+spec-1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"serde_core",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_parser",
|
||||||
|
"toml_writer",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml_datetime"
|
name = "toml_datetime"
|
||||||
version = "1.1.1+spec-1.1.0"
|
version = "1.1.1+spec-1.1.0"
|
||||||
|
|
@ -2440,6 +2571,12 @@ dependencies = [
|
||||||
"winnow",
|
"winnow",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_writer"
|
||||||
|
version = "1.1.1+spec-1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
version = "0.1.44"
|
version = "0.1.44"
|
||||||
|
|
@ -2544,6 +2681,12 @@ version = "0.1.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
|
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "version-compare"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "version_check"
|
name = "version_check"
|
||||||
version = "0.9.5"
|
version = "0.9.5"
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,4 @@ winit = "0.30.13"
|
||||||
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.16", features = ["env-filter"] }
|
||||||
bitflags = "2.2.1"
|
bitflags = "2.2.1"
|
||||||
rodio = "0.22.2"
|
rodio = "0.22.2"
|
||||||
|
cairo-rs = "0.22.0"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{grabs::resize_grab, state::ClientState, state::State};
|
use crate::{state::ClientState, state::State};
|
||||||
use smithay::{
|
use smithay::{
|
||||||
backend::renderer::utils::on_commit_buffer_handler,
|
backend::renderer::utils::on_commit_buffer_handler,
|
||||||
reexports::wayland_server::{
|
reexports::wayland_server::{
|
||||||
|
|
@ -16,8 +16,6 @@ use smithay::{
|
||||||
xwayland::XWaylandClientData,
|
xwayland::XWaylandClientData,
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::xdg_shell;
|
|
||||||
|
|
||||||
impl CompositorHandler for State {
|
impl CompositorHandler for State {
|
||||||
fn compositor_state(&mut self) -> &mut CompositorState {
|
fn compositor_state(&mut self) -> &mut CompositorState {
|
||||||
&mut self.compositor_state
|
&mut self.compositor_state
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ impl XdgShellHandler for State {
|
||||||
fn new_toplevel(&mut self, surface: ToplevelSurface) {
|
fn new_toplevel(&mut self, surface: ToplevelSurface) {
|
||||||
let window = Window::new_wayland_window(surface);
|
let window = Window::new_wayland_window(surface);
|
||||||
self.space
|
self.space
|
||||||
.map_element(DecoratedWindow::new(window), (0, 0), false);
|
.map_element(DecoratedWindow::new(window, false), (0, 0), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_popup(&mut self, surface: PopupSurface, _positioner: PositionerState) {
|
fn new_popup(&mut self, surface: PopupSurface, _positioner: PositionerState) {
|
||||||
|
|
@ -131,6 +131,23 @@ impl XdgShellHandler for State {
|
||||||
fn grab(&mut self, _surface: PopupSurface, _seat: wl_seat::WlSeat, _serial: Serial) {
|
fn grab(&mut self, _surface: PopupSurface, _seat: wl_seat::WlSeat, _serial: Serial) {
|
||||||
// TODO popup grabs
|
// TODO popup grabs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn title_changed(&mut self, surface: ToplevelSurface) {
|
||||||
|
let window = self
|
||||||
|
.space
|
||||||
|
.elements()
|
||||||
|
.filter(|w| w.window.toplevel().is_some())
|
||||||
|
.find(|w| *w.window.toplevel().unwrap() == surface)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
smithay::wayland::compositor::with_states(surface.wl_surface(), |states| {
|
||||||
|
if let Some(data) = states.data_map.get::<XdgToplevelSurfaceData>() {
|
||||||
|
let data = data.lock().unwrap();
|
||||||
|
|
||||||
|
window.set_title(data.title.clone().unwrap_or_default());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_grab(
|
fn check_grab(
|
||||||
|
|
|
||||||
279
src/render.rs
279
src/render.rs
|
|
@ -1,13 +1,19 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
|
use crate::State;
|
||||||
|
use cairo::{Context, Format, ImageSurface};
|
||||||
|
use parking_lot::Mutex;
|
||||||
|
use smithay::backend::allocator::Fourcc;
|
||||||
|
use smithay::backend::renderer::element::memory::MemoryRenderBuffer;
|
||||||
|
use smithay::utils::Transform;
|
||||||
use smithay::{
|
use smithay::{
|
||||||
backend::renderer::{
|
backend::renderer::{
|
||||||
damage::OutputDamageTracker,
|
damage::OutputDamageTracker,
|
||||||
element::{
|
element::{
|
||||||
memory::MemoryRenderBufferRenderElement, solid::SolidColorRenderElement,
|
memory::MemoryRenderBufferRenderElement, surface::WaylandSurfaceRenderElement,
|
||||||
surface::WaylandSurfaceRenderElement, AsRenderElements, Id, Kind,
|
AsRenderElements, Kind,
|
||||||
},
|
},
|
||||||
gles::{GlesRenderer, GlesTarget},
|
gles::{GlesRenderer, GlesTarget},
|
||||||
utils::CommitCounter,
|
ImportAll, ImportDmaWl, ImportMem, ImportMemWl, Renderer, RendererSuper,
|
||||||
Color32F, ImportAll, ImportDmaWl, ImportMem, ImportMemWl, Renderer, RendererSuper,
|
|
||||||
},
|
},
|
||||||
desktop::{space::SpaceElement, Window},
|
desktop::{space::SpaceElement, Window},
|
||||||
output::Output,
|
output::Output,
|
||||||
|
|
@ -16,26 +22,53 @@ use smithay::{
|
||||||
};
|
};
|
||||||
use wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode;
|
use wayland_protocols::xdg::decoration::zv1::server::zxdg_toplevel_decoration_v1::Mode;
|
||||||
|
|
||||||
use crate::State;
|
|
||||||
|
|
||||||
render_elements! {
|
render_elements! {
|
||||||
pub OutputElement<R> where R: ImportMem + ImportDmaWl + ImportMemWl;
|
pub OutputElement<R> where R: ImportMem + ImportDmaWl + ImportMemWl;
|
||||||
Window=WaylandSurfaceRenderElement<R>,
|
Window=WaylandSurfaceRenderElement<R>,
|
||||||
Background=SolidColorRenderElement,
|
Border=MemoryRenderBufferRenderElement<R>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone)]
|
const CSD_BORDER_FRAME_LEFT: f64 = 5.0;
|
||||||
|
const CSD_BORDER_FRAME_RIGHT: f64 = 5.0;
|
||||||
|
const CSD_BORDER_FRAME_TOP: f64 = 23.0;
|
||||||
|
const CSD_BORDER_FRAME_BOTTOM: f64 = 4.0;
|
||||||
|
|
||||||
pub struct DecoratedWindow {
|
pub struct DecoratedWindow {
|
||||||
pub window: Window,
|
pub window: Window,
|
||||||
|
title: Mutex<String>,
|
||||||
|
decorations: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialEq for DecoratedWindow {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.window == other.window
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Eq for DecoratedWindow {}
|
||||||
|
|
||||||
|
impl Clone for DecoratedWindow {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
let title = self.title.lock().clone();
|
||||||
|
Self {
|
||||||
|
window: self.window.clone(),
|
||||||
|
title: Mutex::new(title),
|
||||||
|
decorations: self.decorations,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DecoratedWindow {
|
impl DecoratedWindow {
|
||||||
pub fn new(window: Window) -> Self {
|
pub fn new(window: Window, decorations: bool) -> Self {
|
||||||
Self { window }
|
// let surface = ImageSurface::create(Format::ARgb32, width, height).unwrap();
|
||||||
|
Self {
|
||||||
|
window,
|
||||||
|
title: Mutex::new(String::new()),
|
||||||
|
decorations,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn decorated(&self) -> bool {
|
fn decorated(&self) -> bool {
|
||||||
let mut b = false;
|
let mut b = self.decorations;
|
||||||
if let Some(toplevel) = self.window.toplevel() {
|
if let Some(toplevel) = self.window.toplevel() {
|
||||||
toplevel.with_pending_state(|f| {
|
toplevel.with_pending_state(|f| {
|
||||||
if let Some(decor) = f.decoration_mode {
|
if let Some(decor) = f.decoration_mode {
|
||||||
|
|
@ -45,6 +78,183 @@ impl DecoratedWindow {
|
||||||
}
|
}
|
||||||
b
|
b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_title(&self, title: String) {
|
||||||
|
*self.title.lock() = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn render_border(&self, width: i32, height: i32) -> (Vec<u8>, i32) {
|
||||||
|
let mut surface = ImageSurface::create(Format::ARgb32, width, height).unwrap();
|
||||||
|
let stride = surface.stride();
|
||||||
|
|
||||||
|
{
|
||||||
|
let ctx = Context::new(&surface).unwrap(); // scoped — see note below
|
||||||
|
ctx.set_source_rgba(0.2, 0.2, 0.2, 1.0);
|
||||||
|
ctx.set_line_width(1.0);
|
||||||
|
|
||||||
|
let (w, h) = (width as f64, height as f64);
|
||||||
|
|
||||||
|
macro_rules! do_box {
|
||||||
|
($x:expr, $y:expr, $col:expr, $w:expr, $h:expr) => {
|
||||||
|
ctx.rectangle(($x) as f64, ($y) as f64, ($w) as f64, ($h) as f64);
|
||||||
|
ctx.set_source_rgb(($col) as f64, ($col) as f64, ($col) as f64);
|
||||||
|
ctx.fill().unwrap();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! do_line {
|
||||||
|
($off:expr, $col:expr) => {
|
||||||
|
ctx.move_to($off, $off);
|
||||||
|
ctx.line_to($off, h - $off);
|
||||||
|
ctx.set_source_rgb($col, $col, $col);
|
||||||
|
ctx.stroke().unwrap();
|
||||||
|
ctx.move_to($off, $off);
|
||||||
|
ctx.line_to(w - $off, $off);
|
||||||
|
ctx.set_source_rgb($col, $col, $col);
|
||||||
|
ctx.stroke().unwrap();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.set_antialias(cairo::Antialias::None);
|
||||||
|
|
||||||
|
/* border */
|
||||||
|
do_box!(0.0, 0.0, 0.14901961, w, h);
|
||||||
|
do_box!(1.0, 1.0, 0.55686275, w - 2.0, h - 2.0);
|
||||||
|
do_box!(2.0, 2.0, 0.82352941, w - 4.0, h - 4.0);
|
||||||
|
do_box!(3.0, 3.0, 0.93333333, w - 6.0, h - 6.0);
|
||||||
|
do_box!(4.0, 4.0, 1.0, w - 8.0, h - 8.0);
|
||||||
|
do_box!(4.0, 4.0, 0.14901961, w - 9.0, h - 9.0);
|
||||||
|
do_line!(1.0, 1.0);
|
||||||
|
do_line!(2.0, 0.93333333);
|
||||||
|
do_line!(3.0, 0.82352941);
|
||||||
|
do_line!(4.0, 0.55686275);
|
||||||
|
do_line!(5.0, 0.14901961);
|
||||||
|
for y in 0..18 {
|
||||||
|
let y = y as f64;
|
||||||
|
let a = FloatColor {
|
||||||
|
r: 0.2627451,
|
||||||
|
g: 0.37254902,
|
||||||
|
b: 0.49411765,
|
||||||
|
};
|
||||||
|
let b = FloatColor {
|
||||||
|
r: 0.05490196,
|
||||||
|
g: 0.17254902,
|
||||||
|
b: 0.30588235,
|
||||||
|
};
|
||||||
|
let c = lerp_color(a, b, y / 18.0);
|
||||||
|
|
||||||
|
ctx.set_source_rgb(c.r, c.g, c.b);
|
||||||
|
|
||||||
|
ctx.move_to(5.0, y + 6.0);
|
||||||
|
ctx.line_to(w as f64 - 5.0, y + 6.0);
|
||||||
|
ctx.stroke().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* icon */
|
||||||
|
do_box!(5, 5, 1, 18, 18);
|
||||||
|
do_box!(6, 6, 0.35294118, 17, 17);
|
||||||
|
do_box!(6, 6, 0.82352941, 16, 16);
|
||||||
|
|
||||||
|
/* close */
|
||||||
|
do_box!(
|
||||||
|
w - 18.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 1.0,
|
||||||
|
1,
|
||||||
|
18,
|
||||||
|
18
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 17.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 2.0,
|
||||||
|
0.35294118,
|
||||||
|
17,
|
||||||
|
17
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 17.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 2.0,
|
||||||
|
0.82352941,
|
||||||
|
16,
|
||||||
|
16
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 17.0 - CSD_BORDER_FRAME_LEFT + 5.0,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 7.0,
|
||||||
|
0,
|
||||||
|
6,
|
||||||
|
6
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 17.0 - CSD_BORDER_FRAME_LEFT + 6.0,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 8.0,
|
||||||
|
0.82352941,
|
||||||
|
4,
|
||||||
|
4
|
||||||
|
);
|
||||||
|
|
||||||
|
/* maxim */
|
||||||
|
do_box!(
|
||||||
|
w - 36.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 1.0,
|
||||||
|
1,
|
||||||
|
18,
|
||||||
|
18
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 2.0,
|
||||||
|
0.35294118,
|
||||||
|
17,
|
||||||
|
17
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 2.0,
|
||||||
|
0.82352941,
|
||||||
|
16,
|
||||||
|
16
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT + 5.0,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 7.0,
|
||||||
|
0,
|
||||||
|
6,
|
||||||
|
6
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 9.0,
|
||||||
|
0.82352941,
|
||||||
|
16,
|
||||||
|
2
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT + 7.0,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 4.0,
|
||||||
|
0.82352941,
|
||||||
|
2,
|
||||||
|
14
|
||||||
|
);
|
||||||
|
do_box!(
|
||||||
|
w - 35.0 - CSD_BORDER_FRAME_LEFT + 6.0,
|
||||||
|
CSD_BORDER_FRAME_BOTTOM + 8.0,
|
||||||
|
0.82352941,
|
||||||
|
4,
|
||||||
|
4
|
||||||
|
);
|
||||||
|
|
||||||
|
/* title */
|
||||||
|
ctx.set_antialias(cairo::Antialias::Best);
|
||||||
|
ctx.move_to(28.0, 19.0);
|
||||||
|
ctx.set_font_size(12.0);
|
||||||
|
ctx.select_font_face("", cairo::FontSlant::Normal, cairo::FontWeight::Normal);
|
||||||
|
ctx.text_path(&self.title.lock().clone());
|
||||||
|
ctx.fill().unwrap();
|
||||||
|
} // ctx dropped here
|
||||||
|
|
||||||
|
surface.flush();
|
||||||
|
(surface.data().unwrap().to_vec(), stride)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SpaceElement for DecoratedWindow {
|
impl SpaceElement for DecoratedWindow {
|
||||||
|
|
@ -53,7 +263,7 @@ impl SpaceElement for DecoratedWindow {
|
||||||
|
|
||||||
if self.decorated() {
|
if self.decorated() {
|
||||||
bbox.loc.x -= 5;
|
bbox.loc.x -= 5;
|
||||||
bbox.loc.y -= 22;
|
bbox.loc.y -= 24;
|
||||||
}
|
}
|
||||||
|
|
||||||
bbox
|
bbox
|
||||||
|
|
@ -118,24 +328,51 @@ where
|
||||||
if decorated {
|
if decorated {
|
||||||
let mut bg_rect = self.window.geometry().to_physical_precise_round(scale);
|
let mut bg_rect = self.window.geometry().to_physical_precise_round(scale);
|
||||||
|
|
||||||
bg_rect.size.w += 10;
|
bg_rect.size.w += 11;
|
||||||
bg_rect.size.h += 27;
|
bg_rect.size.h += 29;
|
||||||
|
|
||||||
let background = SolidColorRenderElement::new(
|
let width = bg_rect.size.w;
|
||||||
Id::new(),
|
let height = bg_rect.size.h;
|
||||||
bg_rect,
|
let data = self.render_border(width, height);
|
||||||
CommitCounter::default(),
|
let buffer = MemoryRenderBuffer::from_slice(
|
||||||
Color32F::new(1.0, 0.75, 0.26, 1.0),
|
&data.0,
|
||||||
Kind::Unspecified,
|
Fourcc::Argb8888,
|
||||||
|
(width, height),
|
||||||
|
1, // scale
|
||||||
|
Transform::Normal,
|
||||||
|
None,
|
||||||
);
|
);
|
||||||
|
|
||||||
elements.push(C::from(OutputElement::Background(background)));
|
let elem = MemoryRenderBufferRenderElement::from_buffer(
|
||||||
|
renderer,
|
||||||
|
Point::new(location.x as f64 - 5.0, location.y as f64 - 23.0),
|
||||||
|
&buffer,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Kind::Unspecified,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
elements.push(C::from(OutputElement::Border(elem)));
|
||||||
}
|
}
|
||||||
|
|
||||||
elements
|
elements
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FloatColor {
|
||||||
|
r: f64,
|
||||||
|
g: f64,
|
||||||
|
b: f64,
|
||||||
|
}
|
||||||
|
fn lerp_color(a: FloatColor, b: FloatColor, t: f64) -> FloatColor {
|
||||||
|
return FloatColor {
|
||||||
|
r: a.r + (b.r - a.r) * t,
|
||||||
|
g: a.g + (b.g - a.g) * t,
|
||||||
|
b: a.b + (b.b - a.b) * t,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
pub fn render(
|
pub fn render(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
||||||
|
|
@ -53,7 +53,7 @@ pub struct State {
|
||||||
|
|
||||||
// xdg
|
// xdg
|
||||||
pub xdg_shell_state: XdgShellState,
|
pub xdg_shell_state: XdgShellState,
|
||||||
pub xdg_decoration_state: XdgDecorationState,
|
// pub xdg_decoration_state: XdgDecorationState,
|
||||||
pub xdg_activation_state: XdgActivationState,
|
pub xdg_activation_state: XdgActivationState,
|
||||||
pub xdg_toplevel_icon_manager_state: XdgToplevelIconManager,
|
pub xdg_toplevel_icon_manager_state: XdgToplevelIconManager,
|
||||||
pub xdg_toplevel_tag_manager_state: XdgToplevelTagManager,
|
pub xdg_toplevel_tag_manager_state: XdgToplevelTagManager,
|
||||||
|
|
@ -81,10 +81,8 @@ impl State {
|
||||||
let compositor_state = CompositorState::new::<Self>(&dh);
|
let compositor_state = CompositorState::new::<Self>(&dh);
|
||||||
let xdg_shell_state = XdgShellState::new::<Self>(&dh);
|
let xdg_shell_state = XdgShellState::new::<Self>(&dh);
|
||||||
|
|
||||||
let xdg_decoration_state = XdgDecorationState::new::<Self>(&dh);
|
|
||||||
|
|
||||||
let xdg_shell_state = XdgShellState::new::<Self>(&dh);
|
let xdg_shell_state = XdgShellState::new::<Self>(&dh);
|
||||||
let xdg_decoration_state = XdgDecorationState::new::<Self>(&dh);
|
// let xdg_decoration_state = XdgDecorationState::new::<Self>(&dh);
|
||||||
let xdg_activation_state = XdgActivationState::new::<Self>(&dh);
|
let xdg_activation_state = XdgActivationState::new::<Self>(&dh);
|
||||||
let xdg_toplevel_icon_manager_state = XdgToplevelIconManager::new::<Self>(&dh);
|
let xdg_toplevel_icon_manager_state = XdgToplevelIconManager::new::<Self>(&dh);
|
||||||
let xdg_toplevel_tag_manager_state = XdgToplevelTagManager::new::<Self>(&dh);
|
let xdg_toplevel_tag_manager_state = XdgToplevelTagManager::new::<Self>(&dh);
|
||||||
|
|
@ -152,7 +150,7 @@ impl State {
|
||||||
wl_fixes_state,
|
wl_fixes_state,
|
||||||
output_manager_state,
|
output_manager_state,
|
||||||
|
|
||||||
xdg_decoration_state,
|
// xdg_decoration_state,
|
||||||
xdg_activation_state,
|
xdg_activation_state,
|
||||||
xdg_toplevel_icon_manager_state,
|
xdg_toplevel_icon_manager_state,
|
||||||
xdg_toplevel_tag_manager_state,
|
xdg_toplevel_tag_manager_state,
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ use smithay::{
|
||||||
};
|
};
|
||||||
use wayland_server::{Display, DisplayHandle};
|
use wayland_server::{Display, DisplayHandle};
|
||||||
|
|
||||||
use crate::{state::State, render::DecoratedWindow};
|
use crate::{render::DecoratedWindow, state::State};
|
||||||
|
|
||||||
pub struct XWaylandState {
|
pub struct XWaylandState {
|
||||||
pub xwm: Option<X11Wm>,
|
pub xwm: Option<X11Wm>,
|
||||||
|
|
@ -32,7 +32,7 @@ impl XwmHandler for State {
|
||||||
window.set_mapped(true).unwrap();
|
window.set_mapped(true).unwrap();
|
||||||
|
|
||||||
self.space.map_element(
|
self.space.map_element(
|
||||||
DecoratedWindow::new(Window::new_x11_window(window.clone())),
|
DecoratedWindow::new(Window::new_x11_window(window.clone()), true),
|
||||||
(0, 0),
|
(0, 0),
|
||||||
true,
|
true,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue