1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-08-16 22:31:03 +02:00

Merge pull request #980 from JakeStanger/fix/cairo-leak

fix(cairo): huge memory leak
This commit is contained in:
Jake Stanger 2025-05-14 22:35:55 +01:00 committed by GitHub
commit f3ae57bfe5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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
}); });
} }