diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp index 35b352ea9..8b4eb26c2 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp @@ -68,6 +68,16 @@ constexpr auto kIntrospectionXML = R"INTROSPECTION( )INTROSPECTION"_cs; +struct GtkSelectionDataDeleter { + void operator()(GtkSelectionData *gsel) { + if (gsel) { + gtk_selection_data_free(gsel); + } + } +}; + +using GtkSelectionDataPointer = std::unique_ptr; + Glib::ustring ServiceName; bool GetImageFromClipboardSupported() { @@ -96,11 +106,11 @@ std::vector GetImageFromClipboard() { gdk_atom_intern("image/bmp", true), }; - const auto gsel = [&]() -> GtkSelectionData* { + const auto gsel = [&]() -> GtkSelectionDataPointer { for (const auto &format : supportedFormats) { - if (const auto result = gtk_clipboard_wait_for_contents( - clipboard, - format); gtk_selection_data_get_length(result) > 0) { + if (auto result = GtkSelectionDataPointer( + gtk_clipboard_wait_for_contents(clipboard, format)) + ; gtk_selection_data_get_length(result.get()) > 0) { return result; } } @@ -111,12 +121,8 @@ std::vector GetImageFromClipboard() { return {}; } - const auto guard = gsl::finally([&] { - gtk_selection_data_free(gsel); - }); - - const auto data = gtk_selection_data_get_data(gsel); - const auto length = gtk_selection_data_get_length(gsel); + const auto data = gtk_selection_data_get_data(gsel.get()); + const auto length = gtk_selection_data_get_length(gsel.get()); return std::vector(data, data + length); }