From aaffa76b982c1c92c79317a6813bfe45bc9c885d Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 17 Aug 2022 19:20:05 -0400 Subject: [PATCH] feat: load & watch cosmic.css --- src/lib.rs | 74 ++++++++++++++++++++++++++------- src/wayland.rs | 8 ++-- widgets/src/labeled_item/imp.rs | 3 +- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 588000b9..4c96a8a3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,28 +10,42 @@ pub mod x; pub use libcosmic_widgets as widgets; 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 { +pub fn init() -> (Option, Option) { let _ = gtk4::init(); adw::init(); - let user_provider = gtk4::CssProvider::new(); + let gtk_user_provider = gtk4::CssProvider::new(); if let Some(display) = gdk::Display::default() { gtk4::StyleContext::add_provider_for_display( &display, - &user_provider, + >k_user_provider, 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") - .ok() - .and_then(|xdg_dirs| xdg_dirs.find_config_file("gtk.css")) - .unwrap_or_else(|| "~/.config/gtk-4.0/gtk.css".into()); + .ok() + .and_then(|xdg_dirs| xdg_dirs.find_config_file("gtk.css")) + .unwrap_or_else(|| "~/.config/gtk-4.0/gtk.css".into()); let file = gio::File::for_path(path); - if let Ok(monitor) = file.monitor(FileMonitorFlags::all(), None::<&gio::Cancellable>) { - monitor.connect_changed(glib::clone!(@strong user_provider => move |_monitor, file, _other_file, event| { + let gtk_css_monitor = file.monitor(FileMonitorFlags::all(), None::<&gio::Cancellable>).ok().map(|monitor| { + monitor.connect_changed(glib::clone!(@strong gtk_user_provider => move |_monitor, file, _other_file, event| { match event { FileMonitorEvent::Deleted | FileMonitorEvent::MovedOut | FileMonitorEvent::Renamed => { if adw::is_initialized() { @@ -41,18 +55,46 @@ pub fn init() -> Option { } else { adw_user_colors_lib::colors::ColorOverrides::light_default().as_css() }; - user_provider + gtk_user_provider .load_from_data(css.as_bytes()); } }, FileMonitorEvent::ChangesDoneHint | FileMonitorEvent::Created | FileMonitorEvent::MovedIn => { - user_provider.load_from_file(file); + gtk_user_provider.load_from_file(file); }, _ => {} // ignored } })); - Some(monitor) - } else { - None - } -} \ No newline at end of file + monitor + }); + 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) +} diff --git a/src/wayland.rs b/src/wayland.rs index 122a2705..a87e3b16 100644 --- a/src/wayland.rs +++ b/src/wayland.rs @@ -55,9 +55,7 @@ impl CosmicWaylandDisplay { } let wayland_display = unsafe { - wayland_client::Display::from_external_display( - display.wl_display().c_ptr() as *mut _ - ) + wayland_client::Display::from_external_display(display.wl_display().c_ptr() as *mut _) }; // XXX is this sound? let mut event_queue = wayland_display.create_event_queue(); @@ -176,8 +174,8 @@ impl ObjectImpl for LayerShellWindowInner { fn signals() -> &'static [Signal] { static SIGNALS: Lazy> = Lazy::new(|| { vec![Signal::builder("is-active-notify") - .param_types(&[bool::static_type().into()]) - .build()] + .param_types(&[bool::static_type().into()]) + .build()] }); SIGNALS.as_ref() } diff --git a/widgets/src/labeled_item/imp.rs b/widgets/src/labeled_item/imp.rs index 3a09eb06..8c84bd59 100644 --- a/widgets/src/labeled_item/imp.rs +++ b/widgets/src/labeled_item/imp.rs @@ -1,6 +1,7 @@ use relm4::{ + component::ComponentSenderInner, gtk::{prelude::*, Align, Box as GtkBox, Label, Orientation, Widget}, - ComponentParts, ComponentSender, SimpleComponent, component::ComponentSenderInner, + ComponentParts, ComponentSender, SimpleComponent, }; use std::{cell::RefCell, sync::Arc};