From bb8f9a1b7fba13924a3db3c681976e0cfc770523 Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Sat, 27 Jun 2020 06:12:12 +0400 Subject: [PATCH] Link to gtk3 without QLibrary if DESKTOP_APP_USE_PACKAGED is defined --- Telegram/CMakeLists.txt | 43 ++++--- .../platform/linux/linux_gdk_helper.cpp | 16 ++- .../SourceFiles/platform/linux/linux_libs.cpp | 114 +++++++++--------- .../SourceFiles/platform/linux/linux_libs.h | 6 + 4 files changed, 104 insertions(+), 75 deletions(-) diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index dcd703d168..d0abe76713 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -127,6 +127,35 @@ PRIVATE desktop-app::external_openal ) +if (LINUX AND NOT TDESKTOP_DISABLE_GTK_INTEGRATION) + find_package(PkgConfig REQUIRED) + target_compile_options(Telegram PRIVATE -Wno-register) + + if (DESKTOP_APP_USE_PACKAGED AND NOT DESKTOP_APP_USE_PACKAGED_LAZY) + pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11) + pkg_check_modules(GOBJECT2 REQUIRED IMPORTED_TARGET gobject-2.0) + pkg_check_modules(GLIB2 REQUIRED IMPORTED_TARGET glib-2.0) + pkg_check_modules(GTK3 REQUIRED IMPORTED_TARGET gtk+-3.0) + + target_link_libraries(Telegram + PRIVATE + PkgConfig::X11 + PkgConfig::GOBJECT2 + PkgConfig::GLIB2 + PkgConfig::GTK3 + ) + else() + pkg_search_module(GTK REQUIRED gtk+-2.0 gtk+-3.0) + target_link_libraries(Telegram + PRIVATE + X11 + gobject-2.0 + glib-2.0 + ) + target_include_directories(Telegram PRIVATE ${GTK_INCLUDE_DIRS}) + endif() +endif() + # Telegram uses long atomic types, so on some architectures libatomic is needed. check_cxx_source_compiles(" #include @@ -1143,20 +1172,6 @@ elseif (APPLE) ) endif() endif() -elseif (LINUX) - if (NOT TDESKTOP_DISABLE_GTK_INTEGRATION) - find_package(PkgConfig REQUIRED) - pkg_search_module(GTK REQUIRED gtk+-2.0 gtk+-3.0) - - target_include_directories(Telegram PRIVATE ${GTK_INCLUDE_DIRS}) - target_link_libraries(Telegram - PRIVATE - X11 - gobject-2.0 - glib-2.0 - ) - target_compile_options(Telegram PRIVATE -Wno-register) - endif() endif() if (build_macstore) diff --git a/Telegram/SourceFiles/platform/linux/linux_gdk_helper.cpp b/Telegram/SourceFiles/platform/linux/linux_gdk_helper.cpp index 65c43d9c80..35f3c0c1cc 100644 --- a/Telegram/SourceFiles/platform/linux/linux_gdk_helper.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_gdk_helper.cpp @@ -57,16 +57,20 @@ using f_gdk_x11_window_get_xid = Window(*)(GdkWindow *window); f_gdk_x11_window_get_xid gdk_x11_window_get_xid = nullptr; bool GdkHelperLoadGtk2(QLibrary &lib) { - if (!Libs::load(lib, "gdk_x11_drawable_get_xdisplay", gdk_x11_drawable_get_xdisplay)) return false; - if (!Libs::load(lib, "gdk_x11_drawable_get_xid", gdk_x11_drawable_get_xid)) return false; +#if defined DESKTOP_APP_USE_PACKAGED && !defined DESKTOP_APP_USE_PACKAGED_LAZY + return false; +#else // DESKTOP_APP_USE_PACKAGED && !DESKTOP_APP_USE_PACKAGED_LAZY + if (!LOAD_SYMBOL(lib, "gdk_x11_drawable_get_xdisplay", gdk_x11_drawable_get_xdisplay)) return false; + if (!LOAD_SYMBOL(lib, "gdk_x11_drawable_get_xid", gdk_x11_drawable_get_xid)) return false; return true; +#endif // !DESKTOP_APP_USE_PACKAGED || DESKTOP_APP_USE_PACKAGED_LAZY } bool GdkHelperLoadGtk3(QLibrary &lib) { - if (!Libs::load(lib, "gdk_x11_window_get_type", gdk_x11_window_get_type)) return false; - if (!Libs::load(lib, "gdk_window_get_display", gdk_window_get_display)) return false; - if (!Libs::load(lib, "gdk_x11_display_get_xdisplay", gdk_x11_display_get_xdisplay)) return false; - if (!Libs::load(lib, "gdk_x11_window_get_xid", gdk_x11_window_get_xid)) return false; + if (!LOAD_SYMBOL(lib, "gdk_x11_window_get_type", gdk_x11_window_get_type)) return false; + if (!LOAD_SYMBOL(lib, "gdk_window_get_display", gdk_window_get_display)) return false; + if (!LOAD_SYMBOL(lib, "gdk_x11_display_get_xdisplay", gdk_x11_display_get_xdisplay)) return false; + if (!LOAD_SYMBOL(lib, "gdk_x11_window_get_xid", gdk_x11_window_get_xid)) return false; return true; } diff --git a/Telegram/SourceFiles/platform/linux/linux_libs.cpp b/Telegram/SourceFiles/platform/linux/linux_libs.cpp index 3332650daa..e0706f293a 100644 --- a/Telegram/SourceFiles/platform/linux/linux_libs.cpp +++ b/Telegram/SourceFiles/platform/linux/linux_libs.cpp @@ -23,6 +23,9 @@ namespace { bool gtkTriedToInit = false; bool loadLibrary(QLibrary &lib, const char *name, int version) { +#if defined DESKTOP_APP_USE_PACKAGED && !defined DESKTOP_APP_USE_PACKAGED_LAZY + return true; +#else // DESKTOP_APP_USE_PACKAGED && !DESKTOP_APP_USE_PACKAGED_LAZY DEBUG_LOG(("Loading '%1' with version %2...").arg(QLatin1String(name)).arg(version)); lib.setFileNameAndVersion(QLatin1String(name), version); if (lib.load()) { @@ -36,6 +39,7 @@ bool loadLibrary(QLibrary &lib, const char *name, int version) { } LOG(("Could not load '%1' with version %2 :(").arg(QLatin1String(name)).arg(version)); return false; +#endif // !DESKTOP_APP_USE_PACKAGED || DESKTOP_APP_USE_PACKAGED_LAZY } #ifndef TDESKTOP_DISABLE_GTK_INTEGRATION @@ -69,56 +73,56 @@ void gtkMessageHandler( } bool setupGtkBase(QLibrary &lib_gtk) { - if (!load(lib_gtk, "gtk_init_check", gtk_init_check)) return false; - if (!load(lib_gtk, "gtk_settings_get_default", gtk_settings_get_default)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_init_check", gtk_init_check)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_settings_get_default", gtk_settings_get_default)) return false; - if (!load(lib_gtk, "gtk_widget_show", gtk_widget_show)) return false; - if (!load(lib_gtk, "gtk_widget_hide", gtk_widget_hide)) return false; - if (!load(lib_gtk, "gtk_widget_get_window", gtk_widget_get_window)) return false; - if (!load(lib_gtk, "gtk_widget_realize", gtk_widget_realize)) return false; - if (!load(lib_gtk, "gtk_widget_hide_on_delete", gtk_widget_hide_on_delete)) return false; - if (!load(lib_gtk, "gtk_widget_destroy", gtk_widget_destroy)) return false; - if (!load(lib_gtk, "gtk_clipboard_get", gtk_clipboard_get)) return false; - if (!load(lib_gtk, "gtk_clipboard_store", gtk_clipboard_store)) return false; - if (!load(lib_gtk, "gtk_clipboard_wait_for_contents", gtk_clipboard_wait_for_contents)) return false; - if (!load(lib_gtk, "gtk_clipboard_wait_for_image", gtk_clipboard_wait_for_image)) return false; - if (!load(lib_gtk, "gtk_selection_data_targets_include_image", gtk_selection_data_targets_include_image)) return false; - if (!load(lib_gtk, "gtk_selection_data_free", gtk_selection_data_free)) return false; - if (!load(lib_gtk, "gtk_file_chooser_dialog_new", gtk_file_chooser_dialog_new)) return false; - if (!load(lib_gtk, "gtk_file_chooser_get_type", gtk_file_chooser_get_type)) return false; - if (!load(lib_gtk, "gtk_image_get_type", gtk_image_get_type)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_current_folder", gtk_file_chooser_set_current_folder)) return false; - if (!load(lib_gtk, "gtk_file_chooser_get_current_folder", gtk_file_chooser_get_current_folder)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_current_name", gtk_file_chooser_set_current_name)) return false; - if (!load(lib_gtk, "gtk_file_chooser_select_filename", gtk_file_chooser_select_filename)) return false; - if (!load(lib_gtk, "gtk_file_chooser_get_filenames", gtk_file_chooser_get_filenames)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_filter", gtk_file_chooser_set_filter)) return false; - if (!load(lib_gtk, "gtk_file_chooser_get_filter", gtk_file_chooser_get_filter)) return false; - if (!load(lib_gtk, "gtk_window_get_type", gtk_window_get_type)) return false; - if (!load(lib_gtk, "gtk_window_set_title", gtk_window_set_title)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_local_only", gtk_file_chooser_set_local_only)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_action", gtk_file_chooser_set_action)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_select_multiple", gtk_file_chooser_set_select_multiple)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_do_overwrite_confirmation", gtk_file_chooser_set_do_overwrite_confirmation)) return false; - if (!load(lib_gtk, "gtk_file_chooser_remove_filter", gtk_file_chooser_remove_filter)) return false; - if (!load(lib_gtk, "gtk_file_filter_set_name", gtk_file_filter_set_name)) return false; - if (!load(lib_gtk, "gtk_file_filter_add_pattern", gtk_file_filter_add_pattern)) return false; - if (!load(lib_gtk, "gtk_file_chooser_add_filter", gtk_file_chooser_add_filter)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_preview_widget", gtk_file_chooser_set_preview_widget)) return false; - if (!load(lib_gtk, "gtk_file_chooser_get_preview_filename", gtk_file_chooser_get_preview_filename)) return false; - if (!load(lib_gtk, "gtk_file_chooser_set_preview_widget_active", gtk_file_chooser_set_preview_widget_active)) return false; - if (!load(lib_gtk, "gtk_file_filter_new", gtk_file_filter_new)) return false; - if (!load(lib_gtk, "gtk_image_new", gtk_image_new)) return false; - if (!load(lib_gtk, "gtk_image_set_from_pixbuf", gtk_image_set_from_pixbuf)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_show", gtk_widget_show)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_hide", gtk_widget_hide)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_get_window", gtk_widget_get_window)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_realize", gtk_widget_realize)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_hide_on_delete", gtk_widget_hide_on_delete)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_widget_destroy", gtk_widget_destroy)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_clipboard_get", gtk_clipboard_get)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_clipboard_store", gtk_clipboard_store)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_clipboard_wait_for_contents", gtk_clipboard_wait_for_contents)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_clipboard_wait_for_image", gtk_clipboard_wait_for_image)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_selection_data_targets_include_image", gtk_selection_data_targets_include_image)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_selection_data_free", gtk_selection_data_free)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_dialog_new", gtk_file_chooser_dialog_new)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_get_type", gtk_file_chooser_get_type)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_image_get_type", gtk_image_get_type)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_current_folder", gtk_file_chooser_set_current_folder)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_get_current_folder", gtk_file_chooser_get_current_folder)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_current_name", gtk_file_chooser_set_current_name)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_select_filename", gtk_file_chooser_select_filename)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_get_filenames", gtk_file_chooser_get_filenames)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_filter", gtk_file_chooser_set_filter)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_get_filter", gtk_file_chooser_get_filter)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_window_get_type", gtk_window_get_type)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_window_set_title", gtk_window_set_title)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_local_only", gtk_file_chooser_set_local_only)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_action", gtk_file_chooser_set_action)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_select_multiple", gtk_file_chooser_set_select_multiple)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_do_overwrite_confirmation", gtk_file_chooser_set_do_overwrite_confirmation)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_remove_filter", gtk_file_chooser_remove_filter)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_filter_set_name", gtk_file_filter_set_name)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_filter_add_pattern", gtk_file_filter_add_pattern)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_add_filter", gtk_file_chooser_add_filter)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_preview_widget", gtk_file_chooser_set_preview_widget)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_get_preview_filename", gtk_file_chooser_get_preview_filename)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_chooser_set_preview_widget_active", gtk_file_chooser_set_preview_widget_active)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_file_filter_new", gtk_file_filter_new)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_image_new", gtk_image_new)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_image_set_from_pixbuf", gtk_image_set_from_pixbuf)) return false; - if (!load(lib_gtk, "gdk_window_set_modal_hint", gdk_window_set_modal_hint)) return false; - if (!load(lib_gtk, "gdk_window_focus", gdk_window_focus)) return false; - if (!load(lib_gtk, "gtk_dialog_get_type", gtk_dialog_get_type)) return false; - if (!load(lib_gtk, "gtk_dialog_run", gtk_dialog_run)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gdk_window_set_modal_hint", gdk_window_set_modal_hint)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gdk_window_focus", gdk_window_focus)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_dialog_get_type", gtk_dialog_get_type)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gtk_dialog_run", gtk_dialog_run)) return false; - if (!load(lib_gtk, "gdk_atom_intern", gdk_atom_intern)) return false; + if (!LOAD_SYMBOL(lib_gtk, "gdk_atom_intern", gdk_atom_intern)) return false; - if (load(lib_gtk, "gdk_set_allowed_backends", gdk_set_allowed_backends)) { + if (LOAD_SYMBOL(lib_gtk, "gdk_set_allowed_backends", gdk_set_allowed_backends)) { // We work only with X11 GDK backend. // Otherwise we get segfault in Ubuntu 17.04 in gtk_init_check() call. // See https://github.com/telegramdesktop/tdesktop/issues/3176 @@ -234,18 +238,18 @@ void start() { } if (gtkLoaded) { - load(lib_gtk, "gdk_pixbuf_new_from_file_at_size", gdk_pixbuf_new_from_file_at_size); - load(lib_gtk, "gdk_pixbuf_get_has_alpha", gdk_pixbuf_get_has_alpha); - load(lib_gtk, "gdk_pixbuf_get_pixels", gdk_pixbuf_get_pixels); - load(lib_gtk, "gdk_pixbuf_get_width", gdk_pixbuf_get_width); - load(lib_gtk, "gdk_pixbuf_get_height", gdk_pixbuf_get_height); - load(lib_gtk, "gdk_pixbuf_get_rowstride", gdk_pixbuf_get_rowstride); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_new_from_file_at_size", gdk_pixbuf_new_from_file_at_size); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_get_has_alpha", gdk_pixbuf_get_has_alpha); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_get_pixels", gdk_pixbuf_get_pixels); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_get_width", gdk_pixbuf_get_width); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_get_height", gdk_pixbuf_get_height); + LOAD_SYMBOL(lib_gtk, "gdk_pixbuf_get_rowstride", gdk_pixbuf_get_rowstride); internal::GdkHelperLoad(lib_gtk); - load(lib_gtk, "gtk_dialog_get_widget_for_response", gtk_dialog_get_widget_for_response); - load(lib_gtk, "gtk_button_set_label", gtk_button_set_label); - load(lib_gtk, "gtk_button_get_type", gtk_button_get_type); + LOAD_SYMBOL(lib_gtk, "gtk_dialog_get_widget_for_response", gtk_dialog_get_widget_for_response); + LOAD_SYMBOL(lib_gtk, "gtk_button_set_label", gtk_button_set_label); + LOAD_SYMBOL(lib_gtk, "gtk_button_get_type", gtk_button_get_type); // change the icon theme only if it isn't already set by a platformtheme plugin // if QT_QPA_PLATFORMTHEME=(gtk2|gtk3), then force-apply the icon theme diff --git a/Telegram/SourceFiles/platform/linux/linux_libs.h b/Telegram/SourceFiles/platform/linux/linux_libs.h index 2930d42508..bd2c576fee 100644 --- a/Telegram/SourceFiles/platform/linux/linux_libs.h +++ b/Telegram/SourceFiles/platform/linux/linux_libs.h @@ -20,6 +20,12 @@ extern "C" { #endif // !TDESKTOP_DISABLE_GTK_INTEGRATION +#if defined DESKTOP_APP_USE_PACKAGED && !defined DESKTOP_APP_USE_PACKAGED_LAZY +#define LOAD_SYMBOL(lib, name, func) (func = ::func) +#else // DESKTOP_APP_USE_PACKAGED && !DESKTOP_APP_USE_PACKAGED_LAZY +#define LOAD_SYMBOL Platform::Libs::load +#endif // !DESKTOP_APP_USE_PACKAGED || DESKTOP_APP_USE_PACKAGED_LAZY + namespace Platform { namespace Libs {