Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More RAII cleanup #4788

Merged
merged 18 commits into from
Apr 10, 2023
7 changes: 3 additions & 4 deletions src/core/control/ExportHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
#include <string> // for string

#include <gio/gio.h> // for g_file_new_for_commandlin...
#include <glib-object.h> // for g_object_unref
#include <glib.h> // for g_message, g_error

#include "control/jobs/ImageExport.h" // for ImageExport, EXPORT_GRAPH...
Expand All @@ -15,6 +14,7 @@
#include "pdf/base/XojPdfExportFactory.h" // for XojPdfExportFactory
#include "util/ElementRange.h" // for parse, PageRangeVector
#include "util/i18n.h" // for _
#include "util/raii/GObjectSPtr.h" // for GObjectSPtr

#include "filesystem.h" // for operator==, path, u8path

Expand Down Expand Up @@ -94,12 +94,11 @@ auto exportImg(Document* doc, const char* output, const char* range, const char*
auto exportPdf(Document* doc, const char* output, const char* range, const char* layerRange,
ExportBackgroundType exportBackground, bool progressiveMode) -> int {

GFile* file = g_file_new_for_commandline_arg(output);
xoj::util::GObjectSPtr<GFile> file(g_file_new_for_commandline_arg(output), xoj::util::adopt);

std::unique_ptr<XojPdfExport> pdfe = XojPdfExportFactory::createExport(doc, nullptr);
pdfe->setExportBackground(exportBackground);
auto path = fs::u8path(g_file_peek_path(file));
g_object_unref(file);
auto path = fs::u8path(g_file_peek_path(file.get()));

bool exportSuccess = 0; // Return of the export job

Expand Down
8 changes: 4 additions & 4 deletions src/core/control/latex/LatexGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "util/Util.h" // for Util
#include "util/i18n.h" // for FS, _F
#include "util/raii/GLibGuards.h" // for GErrorGuard, GStrvGuard
#include "util/raii/GObjectSPtr.h" // for GObjectSptr
#include "util/safe_casts.h" // for as_signed
#include "util/serdesstream.h" // for serdes_stream

Expand Down Expand Up @@ -91,12 +92,11 @@ auto LatexGenerator::asyncRun(const fs::path& texDir, const std::string& texFile
}

auto flags = static_cast<GSubprocessFlags>(G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_MERGE);
GSubprocessLauncher* launcher = g_subprocess_launcher_new(flags);
g_subprocess_launcher_set_cwd(launcher, texDir.u8string().c_str());
auto* proc = g_subprocess_launcher_spawnv(launcher, argv, &err);
xoj::util::GObjectSPtr<GSubprocessLauncher> launcher(g_subprocess_launcher_new(flags), xoj::util::adopt);
g_subprocess_launcher_set_cwd(launcher.get(), texDir.u8string().c_str());
auto* proc = g_subprocess_launcher_spawnv(launcher.get(), argv, &err);

std::string progName(prog);
g_object_unref(launcher);

if (proc) {
return {proc};
Expand Down
10 changes: 5 additions & 5 deletions src/core/control/tools/ImageHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "undo/UndoRedoHandler.h" // for UndoRedoHandler
#include "util/XojMsgBox.h" // for XojMsgBox
#include "util/i18n.h" // for _
#include "util/raii/GObjectSPtr.h" // for GObjectSPtr.h

ImageHandler::ImageHandler(Control* control, XojPageView* view) {
this->control = control;
Expand All @@ -31,13 +32,12 @@ ImageHandler::ImageHandler(Control* control, XojPageView* view) {
ImageHandler::~ImageHandler() = default;

auto ImageHandler::insertImage(double x, double y) -> bool {
GFile* file = ImageOpenDlg::show(control->getGtkWindow(), control->getSettings());
if (file == nullptr) {
xoj::util::GObjectSPtr<GFile> file(ImageOpenDlg::show(control->getGtkWindow(), control->getSettings()),
xoj::util::adopt);
if (!file) {
return false;
}
bool result = insertImage(file, x, y);
g_object_unref(file);
return result;
return insertImage(file.get(), x, y);
}

auto ImageHandler::insertImage(GFile* file, double x, double y) -> bool {
Expand Down
7 changes: 3 additions & 4 deletions src/core/control/xojfile/LoadHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -803,7 +803,8 @@ void LoadHandler::parseAudio() {
const char* filename = LoadHandlerHelper::getAttrib("fn", false, this);

GFileIOStream* fileStream = nullptr;
GFile* tmpFile = g_file_new_tmp("xournal_audio_XXXXXX.tmp", &fileStream, nullptr);
xoj::util::GObjectSPtr<GFile> tmpFile(g_file_new_tmp("xournal_audio_XXXXXX.tmp", &fileStream, nullptr),
xoj::util::adopt);
if (!tmpFile) {
g_warning("Unable to create temporary file for audio attachment.");
return;
Expand Down Expand Up @@ -840,7 +841,6 @@ void LoadHandler::parseAudio() {
while (readBytes < length) {
zip_int64_t read = zip_fread(attachmentFile, data, 1024);
if (read == -1) {
g_object_unref(tmpFile);
g_free(data);
zip_fclose(attachmentFile);
error("%s", FC(_F("Could not open attachment: {1}. Error message: Could not read file") % filename));
Expand All @@ -850,7 +850,6 @@ void LoadHandler::parseAudio() {
gboolean writeSuccessful =
g_output_stream_write_all(outputStream, data, static_cast<gsize>(read), nullptr, nullptr, nullptr);
if (!writeSuccessful) {
g_object_unref(tmpFile);
g_free(data);
zip_fclose(attachmentFile);
error("%s", FC(_F("Could not open attachment: {1}. Error message: Could not write file") % filename));
Expand All @@ -862,7 +861,7 @@ void LoadHandler::parseAudio() {
g_free(data);
zip_fclose(attachmentFile);

g_hash_table_insert(this->audioFiles, g_strdup(filename), g_file_get_path(tmpFile));
g_hash_table_insert(this->audioFiles, g_strdup(filename), g_file_get_path(tmpFile.get()));
}

void LoadHandler::parserStartElement(GMarkupParseContext* context, const gchar* elementName,
Expand Down
24 changes: 10 additions & 14 deletions src/core/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -314,11 +314,10 @@ void MainWindow::dragDataRecived(GtkWidget* widget, GdkDragContext* dragContext,
return;
}

GdkPixbuf* image = gtk_selection_data_get_pixbuf(data);
xoj::util::GObjectSPtr<GdkPixbuf> image(gtk_selection_data_get_pixbuf(data), xoj::util::adopt);
if (image) {
win->control->clipboardPasteImage(image);
win->control->clipboardPasteImage(image.get());

g_object_unref(image);
gtk_drag_finish(dragContext, true, false, time);
return;
}
Expand All @@ -331,16 +330,16 @@ void MainWindow::dragDataRecived(GtkWidget* widget, GdkDragContext* dragContext,
GCancellable* cancel = g_cancellable_new();
int cancelTimeout = g_timeout_add(3000, reinterpret_cast<GSourceFunc>(cancellable_cancel), cancel);

GFile* file = g_file_new_for_uri(uri);
xoj::util::GObjectSPtr<GFile> file(g_file_new_for_uri(uri), xoj::util::adopt);
GError* err = nullptr;
GFileInputStream* in = g_file_read(file, cancel, &err);
GFileInputStream* in = g_file_read(file.get(), cancel, &err);
if (g_cancellable_is_cancelled(cancel)) {
continue;
}

g_object_unref(file);
if (err == nullptr) {
GdkPixbuf* pixbuf = gdk_pixbuf_new_from_stream(G_INPUT_STREAM(in), cancel, nullptr);
xoj::util::GObjectSPtr<GdkPixbuf> pixbuf(
gdk_pixbuf_new_from_stream(G_INPUT_STREAM(in), cancel, nullptr), xoj::util::adopt);
if (g_cancellable_is_cancelled(cancel)) {
continue;
}
Expand All @@ -350,9 +349,7 @@ void MainWindow::dragDataRecived(GtkWidget* widget, GdkDragContext* dragContext,
}

if (pixbuf) {
win->control->clipboardPasteImage(pixbuf);

g_object_unref(pixbuf);
win->control->clipboardPasteImage(pixbuf.get());
}
} else {
g_error_free(err);
Expand Down Expand Up @@ -706,11 +703,10 @@ void MainWindow::setAudioPlaybackPaused(bool paused) { this->getToolMenuHandler(

void MainWindow::loadMainCSS(GladeSearchpath* gladeSearchPath, const gchar* cssFilename) {
auto filepath = gladeSearchPath->findFile("", cssFilename);
GtkCssProvider* provider = gtk_css_provider_new();
gtk_css_provider_load_from_path(provider, filepath.u8string().c_str(), nullptr);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(provider),
xoj::util::GObjectSPtr<GtkCssProvider> provider(gtk_css_provider_new(), xoj::util::adopt);
gtk_css_provider_load_from_path(provider.get(), filepath.u8string().c_str(), nullptr);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(provider.get()),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref(provider);
}

PdfFloatingToolbox* MainWindow::getPdfToolbox() const { return this->pdfFloatingToolBox.get(); }
Expand Down
7 changes: 4 additions & 3 deletions src/core/gui/XournalppCursor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,10 @@ void XournalppCursor::setCursorBusy(bool busy) {

if (busy) {
GdkWindow* window = gtk_widget_get_window(win->getWindow());
GdkCursor* cursor = gdk_cursor_new_from_name(gdk_window_get_display(window), cssCursors[CRSR_BUSY].cssName);
gdk_window_set_cursor(window, cursor);
g_object_unref(cursor);
xoj::util::GObjectSPtr<GdkCursor> cursor(
gdk_cursor_new_from_name(gdk_window_get_display(window), cssCursors[CRSR_BUSY].cssName),
xoj::util::adopt);
gdk_window_set_cursor(window, cursor.get());
} else {
if (gtk_widget_get_window(win->getWindow())) {
gdk_window_set_cursor(gtk_widget_get_window(win->getWindow()), nullptr);
Expand Down
26 changes: 14 additions & 12 deletions src/core/model/Document.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "Document.h"

#include <string> // for string
#include <ctime> // for size_t, localtime, strf...
#include <string> // for string
#include <utility> // for move, pair

#include <glib-object.h> // for g_object_unref, G_TYPE_...
Expand All @@ -17,6 +17,7 @@
#include "util/SaveNameUtils.h" // for parseFilename
#include "util/Util.h" // for npos
#include "util/i18n.h" // for FS, _F
#include "util/raii/GObjectSPtr.h" // for GObjectSPtr

#include "LinkDestination.h" // for XojLinkDest, DOCUMENT_L...
#include "XojPage.h" // for XojPage
Expand All @@ -31,11 +32,10 @@ Document::~Document() {

void Document::freeTreeContentModel() {
if (this->contentsModel) {
gtk_tree_model_foreach(this->contentsModel, reinterpret_cast<GtkTreeModelForeachFunc>(freeTreeContentEntry),
this);
gtk_tree_model_foreach(this->contentsModel.get(),
reinterpret_cast<GtkTreeModelForeachFunc>(freeTreeContentEntry), this);

g_object_unref(this->contentsModel);
this->contentsModel = nullptr;
this->contentsModel.reset();
}
}

Expand Down Expand Up @@ -216,10 +216,10 @@ void Document::buildTreeContentsModel(GtkTreeIter* parent, XojPdfBookmarkIterato

link->dest->setExpand(iter->isOpen());

gtk_tree_store_append(GTK_TREE_STORE(contentsModel), &treeIter, parent);
gtk_tree_store_append(GTK_TREE_STORE(contentsModel.get()), &treeIter, parent);
char* titleMarkup = g_markup_escape_text(action->getTitle().c_str(), -1);

gtk_tree_store_set(GTK_TREE_STORE(contentsModel), &treeIter, DOCUMENT_LINKS_COLUMN_NAME, titleMarkup,
gtk_tree_store_set(GTK_TREE_STORE(contentsModel.get()), &treeIter, DOCUMENT_LINKS_COLUMN_NAME, titleMarkup,
DOCUMENT_LINKS_COLUMN_LINK, link, DOCUMENT_LINKS_COLUMN_PAGE_NUMBER, "", -1);

g_free(titleMarkup);
Expand Down Expand Up @@ -257,13 +257,14 @@ void Document::buildContentsModel() {
return;
}

this->contentsModel = reinterpret_cast<GtkTreeModel*>(
gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_OBJECT, G_TYPE_BOOLEAN, G_TYPE_STRING));
this->contentsModel.reset(reinterpret_cast<GtkTreeModel*>(gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_OBJECT,
G_TYPE_BOOLEAN, G_TYPE_STRING)),
xoj::util::adopt);
buildTreeContentsModel(nullptr, iter);
delete iter;
}

auto Document::getContentsModel() const -> GtkTreeModel* { return this->contentsModel; }
auto Document::getContentsModel() const -> GtkTreeModel* { return this->contentsModel.get(); }

auto Document::fillPageLabels(GtkTreeModel* treeModel, GtkTreePath* path, GtkTreeIter* iter, Document* doc) -> bool {
XojLinkDest* link = nullptr;
Expand All @@ -287,8 +288,9 @@ auto Document::fillPageLabels(GtkTreeModel* treeModel, GtkTreePath* path, GtkTre
}

void Document::updateIndexPageNumbers() {
if (this->contentsModel != nullptr) {
gtk_tree_model_foreach(this->contentsModel, reinterpret_cast<GtkTreeModelForeachFunc>(fillPageLabels), this);
if (this->contentsModel) {
gtk_tree_model_foreach(this->contentsModel.get(), reinterpret_cast<GtkTreeModelForeachFunc>(fillPageLabels),
this);
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/core/model/Document.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@

#include "pdf/base/XojPdfDocument.h" // for XojPdfDocument
#include "pdf/base/XojPdfPage.h" // for XojPdfPageSPtr
#include "util/raii/GObjectSPtr.h" // for GObjectSptr

#include "PageRef.h" // for PageRef
#include "filesystem.h" // for path
Expand Down Expand Up @@ -145,7 +146,7 @@ class Document {
/**
* The bookmark contents model
*/
GtkTreeModel* contentsModel = nullptr;
xoj::util::GObjectSPtr<GtkTreeModel> contentsModel;

/**
* create a backup before save
Expand Down
25 changes: 11 additions & 14 deletions src/core/model/Image.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

#include <cairo.h> // for cairo_surface_destroy
#include <gdk/gdk.h> // for gdk_cairo_set_sourc...
#include <glib-object.h> // for g_object_unref
#include <glib.h> // for g_assert, guchar

#include "model/Element.h" // for Element, ELEMENT_IMAGE
#include "util/Rectangle.h" // for Rectangle
#include "util/raii/GObjectSPtr.h" // for GObjectSPtr
#include "util/serializing/ObjectInputStream.h" // for ObjectInputStream
#include "util/serializing/ObjectOutputStream.h" // for ObjectOutputStream

Expand Down Expand Up @@ -73,31 +73,30 @@ void Image::setImage(std::string&& data) {

// FIXME: awful hack to try to parse the format
std::array<char*, 4096> buffer{};
GdkPixbufLoader* loader = gdk_pixbuf_loader_new();
xoj::util::GObjectSPtr<GdkPixbufLoader> loader(gdk_pixbuf_loader_new(), xoj::util::adopt);
size_t remaining = this->data.size();
while (remaining > 0) {
size_t readLen = std::min(remaining, buffer.size());
if (!gdk_pixbuf_loader_write(loader, reinterpret_cast<const guchar*>(this->data.c_str()), readLen, nullptr))
if (!gdk_pixbuf_loader_write(loader.get(), reinterpret_cast<const guchar*>(this->data.c_str()), readLen,
nullptr))
break;
remaining -= readLen;

// Try to determine the format early, if possible
this->format = gdk_pixbuf_loader_get_format(loader);
this->format = gdk_pixbuf_loader_get_format(loader.get());
if (this->format) {
break;
}
}
gdk_pixbuf_loader_close(loader, nullptr);
gdk_pixbuf_loader_close(loader.get(), nullptr);
// if the format was not determined early, it can probably be determined now
if (!this->format) {
this->format = gdk_pixbuf_loader_get_format(loader);
this->format = gdk_pixbuf_loader_get_format(loader.get());
}
g_assert(this->format != nullptr && "could not parse the image format!");

// the format is owned by the pixbuf, so create a copy
this->format = gdk_pixbuf_format_copy(this->format);

g_object_unref(loader);
}

void Image::setImage(GdkPixbuf* img) {
Expand Down Expand Up @@ -131,13 +130,13 @@ void Image::setImage(cairo_surface_t* image) {
auto Image::getImage() const -> cairo_surface_t* {
g_assert(data.length() > 0 && "image has no data, cannot render it!");
if (this->image == nullptr) {
GdkPixbufLoader* loader = gdk_pixbuf_loader_new();
gdk_pixbuf_loader_write(loader, reinterpret_cast<const guchar*>(this->data.c_str()), this->data.length(),
xoj::util::GObjectSPtr<GdkPixbufLoader> loader(gdk_pixbuf_loader_new(), xoj::util::adopt);
gdk_pixbuf_loader_write(loader.get(), reinterpret_cast<const guchar*>(this->data.c_str()), this->data.length(),
nullptr);
bool success = gdk_pixbuf_loader_close(loader, nullptr);
bool success = gdk_pixbuf_loader_close(loader.get(), nullptr);
g_assert(success && "errors in loading image data!");

GdkPixbuf* tmp = gdk_pixbuf_loader_get_pixbuf(loader);
GdkPixbuf* tmp = gdk_pixbuf_loader_get_pixbuf(loader.get());
g_assert(tmp != nullptr);
GdkPixbuf* pixbuf = gdk_pixbuf_apply_embedded_orientation(tmp);

Expand All @@ -155,8 +154,6 @@ auto Image::getImage() const -> cairo_surface_t* {
gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
cairo_paint(cr);
cairo_destroy(cr);

g_object_unref(loader);
}

return this->image;
Expand Down
Loading