cleanup and note about gtk critical error (need to test upstream fix)

This commit is contained in:
Ashley Wulber 2022-01-11 11:16:09 -05:00
parent 537539f43d
commit 9eba89432e
5 changed files with 71 additions and 64 deletions

View file

@ -1,5 +1,4 @@
use cascade::cascade; use cascade::cascade;
use gio::DesktopAppInfo;
use gtk4::glib; use gtk4::glib;
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::subclass::prelude::*; use gtk4::subclass::prelude::*;
@ -12,7 +11,6 @@ use gtk4::Popover;
use crate::dock_object::DockObject; use crate::dock_object::DockObject;
use crate::dock_popover::DockPopover; use crate::dock_popover::DockPopover;
use crate::plugin;
use crate::utils::BoxedWindowList; use crate::utils::BoxedWindowList;
mod imp; mod imp;
@ -107,6 +105,9 @@ impl DockItem {
} }
self_.item_box.borrow().prepend(&image); self_.item_box.borrow().prepend(&image);
let old_image = self_.image.replace(Some(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_value) = dock_object.property("active") {
if let Ok(active) = active_value.get::<BoxedWindowList>() { if let Ok(active) = active_value.get::<BoxedWindowList>() {
let dots = self_.dots.borrow(); let dots = self_.dots.borrow();

View file

@ -150,11 +150,13 @@ impl DockList {
path.push("dock_plugin_uwu.so"); path.push("dock_plugin_uwu.so");
let mut path_css = path_dir.clone(); let mut path_css = path_dir.clone();
path_css.push("dock_plugin_uwu.css"); path_css.push("dock_plugin_uwu.css");
let provider = gtk4::CssProvider::new();
if path.exists() {
let path = path let path = path
.as_os_str() .as_os_str()
.to_str() .to_str()
.expect("plugin path needs to be a valid string"); .expect("plugin path needs to be a valid string");
let provider = gtk4::CssProvider::new();
if let Ok(f) = File::open(path_css) { if let Ok(f) = File::open(path_css) {
let mut reader = BufReader::new(f); let mut reader = BufReader::new(f);
let mut buffer = Vec::new(); let mut buffer = Vec::new();
@ -177,8 +179,9 @@ impl DockList {
let (popover_menu, image, name, lib) = unsafe { let (popover_menu, image, name, lib) = unsafe {
let lib = libloading::Library::new(path).unwrap(); let lib = libloading::Library::new(path).unwrap();
// store library until unloading the plugin // store library until unloading the plugin
let image_func: libloading::Symbol<unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget> = let image_func: libloading::Symbol<
lib.get(b"dock_plugin_image").unwrap(); unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget,
> = lib.get(b"dock_plugin_image").unwrap();
let popover_func: libloading::Symbol< let popover_func: libloading::Symbol<
unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget, unsafe extern "C" fn() -> *mut gtk4_sys::GtkWidget,
> = lib.get(b"dock_plugin_popover_menu").unwrap(); > = lib.get(b"dock_plugin_popover_menu").unwrap();
@ -198,13 +201,16 @@ impl DockList {
String::new() String::new()
}; };
let image = if !image.is_null() { let image = if !image.is_null() {
unsafe { gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(image).unsafe_cast() } unsafe {
gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(image).unsafe_cast()
}
} else { } else {
gtk4::Image::new() gtk4::Image::new()
}; };
let popover_menu = if !popover_menu.is_null() { let popover_menu = if !popover_menu.is_null() {
unsafe { unsafe {
gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(popover_menu).unsafe_cast() gtk4::glib::translate::from_glib_none::<_, gtk4::Widget>(popover_menu)
.unsafe_cast()
} }
} else { } else {
gtk4::Box::new(Orientation::Vertical, 4) gtk4::Box::new(Orientation::Vertical, 4)
@ -218,6 +224,7 @@ impl DockList {
let model = self.model(); let model = self.model();
model.append(&DockObject::from_plugin(boxed_plugin).upcast::<Object>()); model.append(&DockObject::from_plugin(boxed_plugin).upcast::<Object>());
} }
}
fn store_data(model: &gio::ListStore) { fn store_data(model: &gio::ListStore) {
// Store todo data in vector // Store todo data in vector

View file

@ -1 +0,0 @@
ashleywulber@pop-os.190471:1641501268

View file

@ -1,13 +1,12 @@
use std::path::Path; use std::path::Path;
use crate::plugin::{self, BoxedDockPlugin}; use crate::plugin;
use crate::utils::BoxedWindowList; use crate::utils::BoxedWindowList;
use gdk4::glib::Object; use gdk4::glib::Object;
use gdk4::subclass::prelude::ObjectSubclassExt; use gdk4::subclass::prelude::ObjectSubclassExt;
use gio::{DesktopAppInfo, Icon}; use gio::{DesktopAppInfo, Icon};
use gtk4::prelude::*; use gtk4::prelude::*;
use gtk4::{glib, Image}; use gtk4::{glib, Image};
use std::cell::Ref;
mod imp; mod imp;

View file

@ -52,6 +52,7 @@ impl DockPopover {
if let Some(menu) = dock_object.get_popover_menu() { 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 // 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 // appears after setting the menu handle a second time
// possibly solved by https://gitlab.gnome.org/GNOME/gtk/-/issues/4421
menu_handle.append(&menu); menu_handle.append(&menu);
} else { } else {
cascade! { cascade! {