From 9eba89432e458379f9652b2254fca83acc3714b9 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 11 Jan 2022 11:16:09 -0500 Subject: [PATCH] cleanup and note about gtk critical error (need to test upstream fix) --- examples/dock/dock_item/mod.rs | 5 +- examples/dock/dock_list/mod.rs | 125 +++++++++++++++-------------- examples/dock/dock_object/.#mod.rs | 1 - examples/dock/dock_object/mod.rs | 3 +- examples/dock/dock_popover/mod.rs | 1 + 5 files changed, 71 insertions(+), 64 deletions(-) delete mode 120000 examples/dock/dock_object/.#mod.rs diff --git a/examples/dock/dock_item/mod.rs b/examples/dock/dock_item/mod.rs index 9795a17c..a1561869 100644 --- a/examples/dock/dock_item/mod.rs +++ b/examples/dock/dock_item/mod.rs @@ -1,5 +1,4 @@ use cascade::cascade; -use gio::DesktopAppInfo; use gtk4::glib; use gtk4::prelude::*; use gtk4::subclass::prelude::*; @@ -12,7 +11,6 @@ use gtk4::Popover; use crate::dock_object::DockObject; use crate::dock_popover::DockPopover; -use crate::plugin; use crate::utils::BoxedWindowList; mod imp; @@ -107,6 +105,9 @@ impl DockItem { } self_.item_box.borrow().prepend(&image); let old_image = self_.image.replace(Some(image)); + if let Some(old_image) = old_image { + self_.item_box.borrow().remove(&old_image); + } if let Ok(active_value) = dock_object.property("active") { if let Ok(active) = active_value.get::() { let dots = self_.dots.borrow(); diff --git a/examples/dock/dock_list/mod.rs b/examples/dock/dock_list/mod.rs index 8332cd69..6adab174 100644 --- a/examples/dock/dock_list/mod.rs +++ b/examples/dock/dock_list/mod.rs @@ -150,73 +150,80 @@ impl DockList { path.push("dock_plugin_uwu.so"); let mut path_css = path_dir.clone(); path_css.push("dock_plugin_uwu.css"); - let path = path - .as_os_str() - .to_str() - .expect("plugin path needs to be a valid string"); let provider = gtk4::CssProvider::new(); - if let Ok(f) = File::open(path_css) { - let mut reader = BufReader::new(f); - let mut buffer = Vec::new(); + if path.exists() { + let path = path + .as_os_str() + .to_str() + .expect("plugin path needs to be a valid string"); - if reader.read_to_end(&mut buffer).is_ok() { - provider.load_from_data(&buffer); - // Add the provider to the default screen - gtk4::StyleContext::add_provider_for_display( - &gdk4::Display::default().expect("Error initializing GTK CSS provider."), - &provider, - gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION, - ); + if let Ok(f) = File::open(path_css) { + let mut reader = BufReader::new(f); + let mut buffer = Vec::new(); + + if reader.read_to_end(&mut buffer).is_ok() { + provider.load_from_data(&buffer); + // Add the provider to the default screen + gtk4::StyleContext::add_provider_for_display( + &gdk4::Display::default().expect("Error initializing GTK CSS provider."), + &provider, + gtk4::STYLE_PROVIDER_PRIORITY_APPLICATION, + ); + } else { + eprintln!("loading plugin css failed"); + } } else { eprintln!("loading plugin css failed"); } - } else { - eprintln!("loading plugin css failed"); - } - let (popover_menu, image, name, lib) = unsafe { - let lib = libloading::Library::new(path).unwrap(); - // store library until unloading the plugin - let image_func: libloading::Symbol *mut gtk4_sys::GtkWidget> = - lib.get(b"dock_plugin_image").unwrap(); - let popover_func: libloading::Symbol< - unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget, - > = lib.get(b"dock_plugin_popover_menu").unwrap(); - let name_func: libloading::Symbol< - unsafe extern "C" fn() -> *const std::os::raw::c_char, - > = lib.get(b"dock_plugin_name").unwrap(); - // click handler is optional + let (popover_menu, image, name, lib) = unsafe { + let lib = libloading::Library::new(path).unwrap(); + // store library until unloading the plugin + let image_func: libloading::Symbol< + unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget, + > = lib.get(b"dock_plugin_image").unwrap(); + let popover_func: libloading::Symbol< + unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget, + > = lib.get(b"dock_plugin_popover_menu").unwrap(); + let name_func: libloading::Symbol< + unsafe extern "C" fn() -> *const std::os::raw::c_char, + > = lib.get(b"dock_plugin_name").unwrap(); + // click handler is optional - (popover_func(), image_func(), name_func(), lib) - }; - if let Ok(ref mut mutex) = PLUGINS.try_lock() { - mutex.insert(String::from(path), lib); - } - let name = if !name.is_null() { - unsafe { String::from(CStr::from_ptr(name).to_str().unwrap_or_default()) } - } else { - String::new() - }; - let image = if !image.is_null() { - unsafe { gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(image).unsafe_cast() } - } else { - gtk4::Image::new() - }; - let popover_menu = if !popover_menu.is_null() { - unsafe { - gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(popover_menu).unsafe_cast() + (popover_func(), image_func(), name_func(), lib) + }; + if let Ok(ref mut mutex) = PLUGINS.try_lock() { + mutex.insert(String::from(path), lib); } - } else { - gtk4::Box::new(Orientation::Vertical, 4) - }; - let boxed_plugin = plugin::BoxedDockPlugin { - path: String::from(path), - name, - image, - popover_menu, - }; - let model = self.model(); - model.append(&DockObject::from_plugin(boxed_plugin).upcast::()); + let name = if !name.is_null() { + unsafe { String::from(CStr::from_ptr(name).to_str().unwrap_or_default()) } + } else { + String::new() + }; + let image = if !image.is_null() { + unsafe { + gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(image).unsafe_cast() + } + } else { + gtk4::Image::new() + }; + let popover_menu = if !popover_menu.is_null() { + unsafe { + gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(popover_menu) + .unsafe_cast() + } + } else { + gtk4::Box::new(Orientation::Vertical, 4) + }; + let boxed_plugin = plugin::BoxedDockPlugin { + path: String::from(path), + name, + image, + popover_menu, + }; + let model = self.model(); + model.append(&DockObject::from_plugin(boxed_plugin).upcast::()); + } } fn store_data(model: &gio::ListStore) { diff --git a/examples/dock/dock_object/.#mod.rs b/examples/dock/dock_object/.#mod.rs deleted file mode 120000 index b83bca2f..00000000 --- a/examples/dock/dock_object/.#mod.rs +++ /dev/null @@ -1 +0,0 @@ -ashleywulber@pop-os.190471:1641501268 \ No newline at end of file diff --git a/examples/dock/dock_object/mod.rs b/examples/dock/dock_object/mod.rs index 75fb9518..5bc6c9e7 100644 --- a/examples/dock/dock_object/mod.rs +++ b/examples/dock/dock_object/mod.rs @@ -1,13 +1,12 @@ use std::path::Path; -use crate::plugin::{self, BoxedDockPlugin}; +use crate::plugin; use crate::utils::BoxedWindowList; use gdk4::glib::Object; use gdk4::subclass::prelude::ObjectSubclassExt; use gio::{DesktopAppInfo, Icon}; use gtk4::prelude::*; use gtk4::{glib, Image}; -use std::cell::Ref; mod imp; diff --git a/examples/dock/dock_popover/mod.rs b/examples/dock/dock_popover/mod.rs index 32334f0e..c52f4510 100644 --- a/examples/dock/dock_popover/mod.rs +++ b/examples/dock/dock_popover/mod.rs @@ -52,6 +52,7 @@ impl DockPopover { if let Some(menu) = dock_object.get_popover_menu() { // TODO investigate (dock:255244): Gtk-CRITICAL **: 19:12:38.668: gtk_at_context_set_accessible_role: assertion '!self->realized' failed // appears after setting the menu handle a second time + // possibly solved by https://gitlab.gnome.org/GNOME/gtk/-/issues/4421 menu_handle.append(&menu); } else { cascade! {