feat: load & watch cosmic.css
This commit is contained in:
parent
8485b82e9e
commit
aaffa76b98
3 changed files with 63 additions and 22 deletions
72
src/lib.rs
72
src/lib.rs
|
|
@ -10,28 +10,42 @@ pub mod x;
|
||||||
pub use libcosmic_widgets as widgets;
|
pub use libcosmic_widgets as widgets;
|
||||||
|
|
||||||
use adw::StyleManager;
|
use adw::StyleManager;
|
||||||
use gtk4::{gdk, gio::{self, FileMonitorFlags, FileMonitorEvent, FileMonitor}, glib, prelude::*};
|
use gtk4::{
|
||||||
|
gdk,
|
||||||
|
gio::{self, FileMonitor, FileMonitorEvent, FileMonitorFlags},
|
||||||
|
glib,
|
||||||
|
prelude::*,
|
||||||
|
};
|
||||||
|
|
||||||
pub fn init() -> Option<FileMonitor> {
|
pub fn init() -> (Option<FileMonitor>, Option<FileMonitor>) {
|
||||||
let _ = gtk4::init();
|
let _ = gtk4::init();
|
||||||
adw::init();
|
adw::init();
|
||||||
|
|
||||||
let user_provider = gtk4::CssProvider::new();
|
let gtk_user_provider = gtk4::CssProvider::new();
|
||||||
if let Some(display) = gdk::Display::default() {
|
if let Some(display) = gdk::Display::default() {
|
||||||
gtk4::StyleContext::add_provider_for_display(
|
gtk4::StyleContext::add_provider_for_display(
|
||||||
&display,
|
&display,
|
||||||
&user_provider,
|
>k_user_provider,
|
||||||
gtk4::STYLE_PROVIDER_PRIORITY_USER,
|
gtk4::STYLE_PROVIDER_PRIORITY_USER,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let cosmic_user_provider = gtk4::CssProvider::new();
|
||||||
|
if let Some(display) = gdk::Display::default() {
|
||||||
|
gtk4::StyleContext::add_provider_for_display(
|
||||||
|
&display,
|
||||||
|
&cosmic_user_provider,
|
||||||
|
gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
let path = xdg::BaseDirectories::with_prefix("gtk-4.0")
|
let path = xdg::BaseDirectories::with_prefix("gtk-4.0")
|
||||||
.ok()
|
.ok()
|
||||||
.and_then(|xdg_dirs| xdg_dirs.find_config_file("gtk.css"))
|
.and_then(|xdg_dirs| xdg_dirs.find_config_file("gtk.css"))
|
||||||
.unwrap_or_else(|| "~/.config/gtk-4.0/gtk.css".into());
|
.unwrap_or_else(|| "~/.config/gtk-4.0/gtk.css".into());
|
||||||
let file = gio::File::for_path(path);
|
let file = gio::File::for_path(path);
|
||||||
if let Ok(monitor) = file.monitor(FileMonitorFlags::all(), None::<&gio::Cancellable>) {
|
let gtk_css_monitor = file.monitor(FileMonitorFlags::all(), None::<&gio::Cancellable>).ok().map(|monitor| {
|
||||||
monitor.connect_changed(glib::clone!(@strong user_provider => move |_monitor, file, _other_file, event| {
|
monitor.connect_changed(glib::clone!(@strong gtk_user_provider => move |_monitor, file, _other_file, event| {
|
||||||
match event {
|
match event {
|
||||||
FileMonitorEvent::Deleted | FileMonitorEvent::MovedOut | FileMonitorEvent::Renamed => {
|
FileMonitorEvent::Deleted | FileMonitorEvent::MovedOut | FileMonitorEvent::Renamed => {
|
||||||
if adw::is_initialized() {
|
if adw::is_initialized() {
|
||||||
|
|
@ -41,18 +55,46 @@ pub fn init() -> Option<FileMonitor> {
|
||||||
} else {
|
} else {
|
||||||
adw_user_colors_lib::colors::ColorOverrides::light_default().as_css()
|
adw_user_colors_lib::colors::ColorOverrides::light_default().as_css()
|
||||||
};
|
};
|
||||||
user_provider
|
gtk_user_provider
|
||||||
.load_from_data(css.as_bytes());
|
.load_from_data(css.as_bytes());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
FileMonitorEvent::ChangesDoneHint | FileMonitorEvent::Created | FileMonitorEvent::MovedIn => {
|
FileMonitorEvent::ChangesDoneHint | FileMonitorEvent::Created | FileMonitorEvent::MovedIn => {
|
||||||
user_provider.load_from_file(file);
|
gtk_user_provider.load_from_file(file);
|
||||||
},
|
},
|
||||||
_ => {} // ignored
|
_ => {} // ignored
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
Some(monitor)
|
monitor
|
||||||
} else {
|
});
|
||||||
None
|
let path = xdg::BaseDirectories::with_prefix("gtk-4.0")
|
||||||
}
|
.ok()
|
||||||
|
.and_then(|xdg_dirs| xdg_dirs.find_config_file("cosmic.css"))
|
||||||
|
.unwrap_or_else(|| "~/.config/gtk-4.0/cosmic.css".into());
|
||||||
|
let file = gio::File::for_path(path);
|
||||||
|
cosmic_user_provider.load_from_file(&file);
|
||||||
|
let cosmic_css_monitor = file.monitor(FileMonitorFlags::all(), None::<&gio::Cancellable>).ok().map(|monitor| {
|
||||||
|
monitor.connect_changed(glib::clone!(@strong cosmic_user_provider => move |_monitor, file, _other_file, event| {
|
||||||
|
match event {
|
||||||
|
FileMonitorEvent::Deleted | FileMonitorEvent::MovedOut | FileMonitorEvent::Renamed => {
|
||||||
|
if adw::is_initialized() {
|
||||||
|
let manager = StyleManager::default();
|
||||||
|
let css = if manager.is_dark() {
|
||||||
|
adw_user_colors_lib::colors::ColorOverrides::dark_default().as_css()
|
||||||
|
} else {
|
||||||
|
adw_user_colors_lib::colors::ColorOverrides::light_default().as_css()
|
||||||
|
};
|
||||||
|
cosmic_user_provider
|
||||||
|
.load_from_data(css.as_bytes());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
FileMonitorEvent::ChangesDoneHint | FileMonitorEvent::Created | FileMonitorEvent::MovedIn => {
|
||||||
|
cosmic_user_provider.load_from_file(file);
|
||||||
|
},
|
||||||
|
_ => {} // ignored
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
monitor
|
||||||
|
});
|
||||||
|
(gtk_css_monitor, cosmic_css_monitor)
|
||||||
}
|
}
|
||||||
|
|
@ -55,9 +55,7 @@ impl CosmicWaylandDisplay {
|
||||||
}
|
}
|
||||||
|
|
||||||
let wayland_display = unsafe {
|
let wayland_display = unsafe {
|
||||||
wayland_client::Display::from_external_display(
|
wayland_client::Display::from_external_display(display.wl_display().c_ptr() as *mut _)
|
||||||
display.wl_display().c_ptr() as *mut _
|
|
||||||
)
|
|
||||||
}; // XXX is this sound?
|
}; // XXX is this sound?
|
||||||
|
|
||||||
let mut event_queue = wayland_display.create_event_queue();
|
let mut event_queue = wayland_display.create_event_queue();
|
||||||
|
|
@ -176,8 +174,8 @@ impl ObjectImpl for LayerShellWindowInner {
|
||||||
fn signals() -> &'static [Signal] {
|
fn signals() -> &'static [Signal] {
|
||||||
static SIGNALS: Lazy<Vec<Signal>> = Lazy::new(|| {
|
static SIGNALS: Lazy<Vec<Signal>> = Lazy::new(|| {
|
||||||
vec![Signal::builder("is-active-notify")
|
vec![Signal::builder("is-active-notify")
|
||||||
.param_types(&[bool::static_type().into()])
|
.param_types(&[bool::static_type().into()])
|
||||||
.build()]
|
.build()]
|
||||||
});
|
});
|
||||||
SIGNALS.as_ref()
|
SIGNALS.as_ref()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
use relm4::{
|
use relm4::{
|
||||||
|
component::ComponentSenderInner,
|
||||||
gtk::{prelude::*, Align, Box as GtkBox, Label, Orientation, Widget},
|
gtk::{prelude::*, Align, Box as GtkBox, Label, Orientation, Widget},
|
||||||
ComponentParts, ComponentSender, SimpleComponent, component::ComponentSenderInner,
|
ComponentParts, ComponentSender, SimpleComponent,
|
||||||
};
|
};
|
||||||
use std::{cell::RefCell, sync::Arc};
|
use std::{cell::RefCell, sync::Arc};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue