2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-08-25 19:57:20 +00:00
tdesktop/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp

135 lines
3.5 KiB
C++
Raw Normal View History

2021-01-10 07:51:38 +04:00
/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#include "platform/linux/linux_gtk_integration.h"
2021-02-19 04:37:06 +04:00
#include "base/platform/linux/base_linux_gtk_integration.h"
#include "base/platform/linux/base_linux_gtk_integration_p.h"
2021-01-10 07:51:38 +04:00
#include "platform/linux/linux_gtk_integration_p.h"
#include "platform/linux/linux_gdk_helper.h"
#include "platform/linux/linux_gtk_open_with_dialog.h"
2021-01-10 07:51:38 +04:00
namespace Platform {
namespace internal {
using namespace Platform::Gtk;
2021-02-19 04:37:06 +04:00
using BaseGtkIntegration = base::Platform::GtkIntegration;
2021-01-10 07:51:38 +04:00
namespace {
bool GetImageFromClipboardSupported() {
return (gtk_clipboard_get != nullptr)
&& (gtk_clipboard_wait_for_contents != nullptr)
&& (gtk_clipboard_wait_for_image != nullptr)
&& (gtk_selection_data_targets_include_image != nullptr)
&& (gtk_selection_data_free != nullptr)
&& (gdk_pixbuf_get_pixels != nullptr)
&& (gdk_pixbuf_get_width != nullptr)
&& (gdk_pixbuf_get_height != nullptr)
&& (gdk_pixbuf_get_rowstride != nullptr)
&& (gdk_pixbuf_get_has_alpha != nullptr)
&& (gdk_atom_intern != nullptr);
}
} // namespace
GtkIntegration::GtkIntegration() {
}
GtkIntegration *GtkIntegration::Instance() {
2021-02-19 04:37:06 +04:00
if (!BaseGtkIntegration::Instance()) {
2021-01-10 07:51:38 +04:00
return nullptr;
}
static GtkIntegration instance;
return &instance;
}
void GtkIntegration::load() {
static bool Loaded = false;
Expects(!Loaded);
2021-01-10 07:51:38 +04:00
2021-02-19 04:37:06 +04:00
if (!BaseGtkIntegration::Instance()->loaded()) {
return;
2021-01-10 07:51:38 +04:00
}
auto &lib = BaseGtkIntegration::Instance()->library();
2021-03-31 15:25:19 +04:00
LOAD_GTK_SYMBOL(lib, gtk_widget_show);
LOAD_GTK_SYMBOL(lib, gtk_widget_get_window);
LOAD_GTK_SYMBOL(lib, gtk_widget_realize);
LOAD_GTK_SYMBOL(lib, gtk_widget_destroy);
LOAD_GTK_SYMBOL(lib, gtk_clipboard_get);
LOAD_GTK_SYMBOL(lib, gtk_clipboard_wait_for_contents);
LOAD_GTK_SYMBOL(lib, gtk_clipboard_wait_for_image);
LOAD_GTK_SYMBOL(lib, gtk_selection_data_targets_include_image);
LOAD_GTK_SYMBOL(lib, gtk_selection_data_free);
LOAD_GTK_SYMBOL(lib, gdk_atom_intern);
LOAD_GTK_SYMBOL(lib, gdk_pixbuf_get_has_alpha);
LOAD_GTK_SYMBOL(lib, gdk_pixbuf_get_pixels);
LOAD_GTK_SYMBOL(lib, gdk_pixbuf_get_width);
LOAD_GTK_SYMBOL(lib, gdk_pixbuf_get_height);
LOAD_GTK_SYMBOL(lib, gdk_pixbuf_get_rowstride);
GdkHelperLoad(lib);
2021-03-31 15:25:19 +04:00
LOAD_GTK_SYMBOL(lib, gtk_app_chooser_dialog_new);
LOAD_GTK_SYMBOL(lib, gtk_app_chooser_get_app_info);
LOAD_GTK_SYMBOL(lib, gtk_app_chooser_get_type);
2021-02-19 04:37:06 +04:00
Loaded = true;
2021-01-10 07:51:38 +04:00
}
bool GtkIntegration::showOpenWithDialog(const QString &filepath) const {
return File::internal::ShowGtkOpenWithDialog(filepath);
2021-01-10 07:51:38 +04:00
}
QImage GtkIntegration::getImageFromClipboard() const {
QImage data;
if (!GetImageFromClipboardSupported()) {
return data;
}
const auto clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
if (!clipboard) {
return data;
}
auto gsel = gtk_clipboard_wait_for_contents(
clipboard,
gdk_atom_intern("TARGETS", true));
if (gsel) {
if (gtk_selection_data_targets_include_image(gsel, false)) {
auto img = gtk_clipboard_wait_for_image(clipboard);
if (img) {
data = QImage(
gdk_pixbuf_get_pixels(img),
gdk_pixbuf_get_width(img),
gdk_pixbuf_get_height(img),
gdk_pixbuf_get_rowstride(img),
gdk_pixbuf_get_has_alpha(img)
? QImage::Format_RGBA8888
: QImage::Format_RGB888).copy();
g_object_unref(img);
}
}
gtk_selection_data_free(gsel);
}
return data;
}
} // namespace internal
} // namespace Platform