mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-08-16 22:31:03 +02:00
fix(cairo): huge memory leak
Fixes increasing the reference count of the `Context` without ever decreasing it. Fixes #972
This commit is contained in:
parent
fe1d28cda8
commit
e240ab7acb
1 changed files with 14 additions and 8 deletions
|
@ -3,7 +3,7 @@ use crate::modules::{Module, ModuleInfo, ModuleParts, ModuleUpdateEvent, WidgetC
|
||||||
use crate::{glib_recv, module_impl, spawn, try_send};
|
use crate::{glib_recv, module_impl, spawn, try_send};
|
||||||
use cairo::{Format, ImageSurface};
|
use cairo::{Format, ImageSurface};
|
||||||
use glib::Propagation;
|
use glib::Propagation;
|
||||||
use glib::translate::IntoGlibPtr;
|
use glib::translate::ToGlibPtr;
|
||||||
use gtk::DrawingArea;
|
use gtk::DrawingArea;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use mlua::{Error, Function, LightUserData};
|
use mlua::{Error, Function, LightUserData};
|
||||||
|
@ -146,21 +146,23 @@ impl Module<gtk::Box> for CairoModule {
|
||||||
|
|
||||||
let path = self.path.clone();
|
let path = self.path.clone();
|
||||||
|
|
||||||
area.connect_draw(move |_, cr| {
|
let function: Function = lua
|
||||||
let function: Function = lua
|
.load(include_str!("../../lua/draw.lua"))
|
||||||
.load(include_str!("../../lua/draw.lua"))
|
.eval()
|
||||||
.eval()
|
.expect("to be valid");
|
||||||
.expect("to be valid");
|
|
||||||
|
|
||||||
|
area.connect_draw(move |_, cr| {
|
||||||
if let Err(err) = cr.set_source_surface(&surface, 0.0, 0.0) {
|
if let Err(err) = cr.set_source_surface(&surface, 0.0, 0.0) {
|
||||||
error!("{err}");
|
error!("{err}");
|
||||||
return Propagation::Stop;
|
return Propagation::Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
let ptr = unsafe { cr.clone().into_glib_ptr().cast() };
|
let ptr = cr.to_glib_full();
|
||||||
|
|
||||||
// mlua needs a valid return type, even if we don't return anything
|
// mlua needs a valid return type, even if we don't return anything
|
||||||
if let Err(err) = function.call::<Option<bool>>((id.as_str(), LightUserData(ptr))) {
|
if let Err(err) =
|
||||||
|
function.call::<Option<bool>>((id.as_str(), LightUserData(ptr.cast())))
|
||||||
|
{
|
||||||
if let Error::RuntimeError(message) = err {
|
if let Error::RuntimeError(message) = err {
|
||||||
let message = message.split_once("]:").expect("to exist").1;
|
let message = message.split_once("]:").expect("to exist").1;
|
||||||
error!("[lua runtime error] {}:{message}", path.display());
|
error!("[lua runtime error] {}:{message}", path.display());
|
||||||
|
@ -171,6 +173,10 @@ impl Module<gtk::Box> for CairoModule {
|
||||||
return Propagation::Stop;
|
return Propagation::Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
cairo::ffi::cairo_destroy(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue