diff --git a/Cargo.lock b/Cargo.lock index 51040417..e359364d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,6 +39,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "byte_string" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11aade7a05aa8c3a351cedc44c3fc45806430543382fcc4743a9b757a2a0b4ed" + [[package]] name = "byteorder" version = "1.4.3" @@ -759,6 +765,7 @@ dependencies = [ name = "pop-cosmic-panel" version = "0.1.0" dependencies = [ + "byte_string", "cascade", "chrono", "gdk4-x11", diff --git a/Cargo.toml b/Cargo.toml index 3ab33917..985e4e2d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" [dependencies] cascade = "1" chrono = "0.4" +byte_string = "1" gdk4-x11 = "0.2" gtk4 = "0.2" once_cell = "1" diff --git a/src/status_area.rs b/src/status_area.rs index c3a3463d..ac8d2144 100644 --- a/src/status_area.rs +++ b/src/status_area.rs @@ -3,6 +3,7 @@ // - Register with StatusNotiferWatcher // - Handle signals for registered/unreigisted items +use byte_string::ByteStr; use cascade::cascade; use gtk4::{ gio, @@ -11,7 +12,7 @@ use gtk4::{ subclass::prelude::*, }; use once_cell::unsync::OnceCell; -use std::{borrow::Cow, cell::RefCell, collections::HashMap}; +use std::{borrow::Cow, cell::RefCell, collections::HashMap, fmt}; use crate::deref_cell::DerefCell; @@ -99,7 +100,7 @@ impl StatusArea { self.inner().box_.append(&image); if let Some(menu) = item.menu() { - println!("{:?}", menu.get_layout(0, -1, &[]).await); + println!("{:#?}", menu.get_layout(0, -1, &[]).await); } self.item_unregistered(name); @@ -119,9 +120,74 @@ impl StatusArea { } } -#[derive(Debug)] +//#[derive(Debug)] struct Layout(i32, HashMap, Vec); +impl fmt::Debug for Layout { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let mut s = f.debug_struct("Layout"); + s.field("id", &self.0); + for (k, v) in &self.1 { + if let Some(v) = v.get::() { + s.field(k, &v); + } else if let Some(v) = v.get::() { + s.field(k, &v); + } else if let Some(v) = v.get::() { + s.field(k, &v); + } else if let Some(v) = v.get::>() { + s.field(k, &ByteStr::new(&v)); + } else { + s.field(k, v); + } + } + s.field("children", &self.2); + s.finish() + } +} + +#[allow(dead_code)] +impl Layout { + fn prop(&self, name: &str) -> Option { + self.1.get(name)?.get() + } + + fn accessible_desc(&self) -> Option { + self.prop("accessible-desc") + } + + fn children_display(&self) -> Option { + self.prop("children-display") + } + + fn label(&self) -> Option { + self.prop("label") + } + + fn enabled(&self) -> Option { + self.prop("enabled") + } + + fn visible(&self) -> Option { + self.prop("visible") + } + + fn type_(&self) -> Option { + self.prop("type") + } + + fn toggle_type(&self) -> Option { + self.prop("toggle-type") + } + + fn toggle_state(&self) -> Option { + self.prop("toggle-state") + } + + fn icon_data(&self) -> Option> { + self.prop("icon-data") + } +} + impl glib::StaticVariantType for Layout { fn static_variant_type() -> Cow<'static, glib::VariantTy> { glib::VariantTy::new("(ia{sv}av)").unwrap().into()