diff --git a/CMakeLists.txt b/CMakeLists.txt index 7299f07..799ba0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,11 @@ if (LINUX AND Qt5WaylandClient_FOUND) add_subdirectory(linux_wayland_helper) endif() +if (LINUX + AND NOT DESKTOP_APP_USE_PACKAGED + AND NOT DESKTOP_APP_DIABLE_GTK_INTEGRATION) + add_subdirectory(linux_gtk_helper) +endif() if (DESKTOP_APP_USE_ALLOCATION_TRACER) add_subdirectory(linux_allocation_tracer) endif() diff --git a/external/qt/CMakeLists.txt b/external/qt/CMakeLists.txt index 77aa5b5..e601502 100644 --- a/external/qt/CMakeLists.txt +++ b/external/qt/CMakeLists.txt @@ -220,10 +220,17 @@ else() plugins/wayland-decoration-client/${qt_lib_prefix}bradient ) endif() + set(qt_libs_gtk_plugins) + if (NOT DESKTOP_APP_DISABLE_GTK_INTEGRATION) + set(qt_libs_gtk_plugins + plugins/platformthemes/${qt_lib_prefix}qgtk3 + ) + endif() set(qt_libs plugins/platforminputcontexts/${qt_lib_prefix}composeplatforminputcontextplugin ${qt_libs_dbus_plugins} ${qt_libs_waylandclient_plugins} + ${qt_libs_gtk_plugins} plugins/platforms/${qt_lib_prefix}qxcb plugins/xcbglintegrations/${qt_lib_prefix}qxcb-egl-integration plugins/xcbglintegrations/${qt_lib_prefix}qxcb-glx-integration @@ -322,6 +329,13 @@ else() $ ) endif() + if (NOT DESKTOP_APP_DISABLE_GTK_INTEGRATION) + target_link_libraries(external_qt + INTERFACE + desktop-app::linux_gtk_helper + $ + ) + endif() target_link_libraries(external_qt INTERFACE fontconfig diff --git a/external/qt/qt_static_plugins/qt_static_plugins.cpp b/external/qt/qt_static_plugins/qt_static_plugins.cpp index 9f0244b..71b4bad 100644 --- a/external/qt/qt_static_plugins/qt_static_plugins.cpp +++ b/external/qt/qt_static_plugins/qt_static_plugins.cpp @@ -39,6 +39,9 @@ Q_IMPORT_PLUGIN(QWaylandEglClientBufferPlugin) Q_IMPORT_PLUGIN(QWaylandWlShellIntegrationPlugin) Q_IMPORT_PLUGIN(QWaylandBradientDecorationPlugin) #endif // !DESKTOP_APP_DISABLE_WAYLAND_INTEGRATION +#ifndef DESKTOP_APP_DISABLE_GTK_INTEGRATION +Q_IMPORT_PLUGIN(QGtk3ThemePlugin) +#endif // !DESKTOP_APP_DISABLE_GTK_INTEGRATION #endif // Q_OS_WIN | Q_OS_MAC | Q_OS_UNIX #endif // !DESKTOP_APP_USE_PACKAGED diff --git a/linux_gtk_helper/CMakeLists.txt b/linux_gtk_helper/CMakeLists.txt new file mode 100644 index 0000000..32ec4aa --- /dev/null +++ b/linux_gtk_helper/CMakeLists.txt @@ -0,0 +1,24 @@ +# This file is part of Desktop App Toolkit, +# a set of libraries for developing nice desktop applications. +# +# For license and copyright information please follow this link: +# https://github.com/desktop-app/legal/blob/master/LEGAL + +add_library(linux_gtk_helper STATIC) +add_library(desktop-app::linux_gtk_helper ALIAS linux_gtk_helper) + +nice_target_sources(linux_gtk_helper ${CMAKE_CURRENT_SOURCE_DIR} +PRIVATE + linux_gtk_helper.cpp +) + +target_compile_definitions(linux_gtk_helper PRIVATE G_LOG_DOMAIN="GtkHelper") + +target_link_libraries(linux_gtk_helper +PUBLIC + desktop-app::external_glib +) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED gtk+-3.0) +target_include_directories(linux_gtk_helper PRIVATE ${GTK_INCLUDE_DIRS}) diff --git a/linux_gtk_helper/linux_gtk_helper.cpp b/linux_gtk_helper/linux_gtk_helper.cpp new file mode 100644 index 0000000..231eb78 --- /dev/null +++ b/linux_gtk_helper/linux_gtk_helper.cpp @@ -0,0 +1,972 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#include +#include +#include +#include +#include +#include + +#define LOAD_SYMBOL(handle, func) LoadSymbol(handle, #func, func) + +namespace GtkHelper { +namespace { + +GdkPixbuf *(*gdk_pixbuf_new_from_file_at_size)( + const char *filename, + int width, + int height, + GError **error); +void (*gdk_window_focus)(GdkWindow *window, guint32 timestamp); +GdkDisplay *(*gdk_window_get_display)(GdkWindow *window); +void (*gdk_window_set_modal_hint)(GdkWindow *window, gboolean modal); +Display *(*gdk_x11_display_get_xdisplay)(GdkDisplay *display); +GType (*gdk_x11_window_get_type)(void); +Window (*gdk_x11_window_get_xid)(GdkWindow *window); +GType (*gtk_accel_label_get_type)(void); +void (*gtk_accel_label_set_accel)( + GtkAccelLabel *accel_label, + guint accelerator_key, + GdkModifierType accelerator_mods); +GtkWidget *(*gtk_bin_get_child)(GtkBin *bin); +GType (*gtk_bin_get_type)(void); +GType (*gtk_button_get_type)(void); +void (*gtk_button_set_label)(GtkButton *button, const gchar *label); +gboolean (*gtk_check_menu_item_get_active)(GtkCheckMenuItem *check_menu_item); +GType (*gtk_check_menu_item_get_type)(void); +GtkWidget* (*gtk_check_menu_item_new)(void); +void (*gtk_check_menu_item_set_active)( + GtkCheckMenuItem *check_menu_item, + gboolean is_active); +const gchar *(*gtk_check_version)( + guint required_major, + guint required_minor, + guint required_micro); +GtkClipboard *(*gtk_clipboard_get)(GdkAtom selection); +void (*gtk_clipboard_store)(GtkClipboard *clipboard); +GtkWidget *(*gtk_color_chooser_dialog_new)( + const gchar *title, + GtkWindow *parent); +GType (*gtk_color_chooser_get_type)(void); +void (*gtk_color_chooser_get_rgba)( + GtkColorChooser *chooser, + GdkRGBA *color); +void (*gtk_color_chooser_set_rgba)( + GtkColorChooser *chooser, + const GdkRGBA *color); +void (*gtk_color_chooser_set_use_alpha)( + GtkColorChooser *chooser, + gboolean use_alpha); +GType (*gtk_container_get_type)(void); +void (*gtk_container_remove)(GtkContainer *container, GtkWidget *widget); +GType (*gtk_dialog_get_type)(void); +GtkWidget* (*gtk_dialog_get_widget_for_response)( + GtkDialog *dialog, + gint response_id); +gint (*gtk_dialog_run)(GtkDialog *dialog); +void (*gtk_file_chooser_add_filter)( + GtkFileChooser *chooser, + GtkFileFilter *filter); +GtkWidget *(*gtk_file_chooser_dialog_new)( + const gchar *title, + GtkWindow *parent, + GtkFileChooserAction action, + const gchar *first_button_text, + ...); +gchar *(*gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser); +gchar *(*gtk_file_chooser_get_filename)(GtkFileChooser *chooser); +GSList *(*gtk_file_chooser_get_filenames)(GtkFileChooser *chooser); +GtkFileFilter *(*gtk_file_chooser_get_filter)(GtkFileChooser *chooser); +char *(*gtk_file_chooser_get_preview_filename)(GtkFileChooser *chooser); +GType (*gtk_file_chooser_get_type)(void); +void (*gtk_file_chooser_remove_filter)( + GtkFileChooser *chooser, + GtkFileFilter *filter); +gboolean (*gtk_file_chooser_select_filename)( + GtkFileChooser *chooser, + const char *filename); +void (*gtk_file_chooser_set_action)( + GtkFileChooser *chooser, + GtkFileChooserAction action); +void (*gtk_file_chooser_set_create_folders)( + GtkFileChooser *chooser, + gboolean create_folders); +gboolean (*gtk_file_chooser_set_current_folder)( + GtkFileChooser *chooser, + const gchar *filename); +void (*gtk_file_chooser_set_current_name)( + GtkFileChooser *chooser, + const gchar *name); +void (*gtk_file_chooser_set_do_overwrite_confirmation)( + GtkFileChooser *chooser, + gboolean do_overwrite_confirmation); +void (*gtk_file_chooser_set_filter)( + GtkFileChooser *chooser, + GtkFileFilter *filter); +void (*gtk_file_chooser_set_local_only)( + GtkFileChooser *chooser, + gboolean local_only); +void (*gtk_file_chooser_set_preview_widget)( + GtkFileChooser *chooser, + GtkWidget *preview_widget); +void (*gtk_file_chooser_set_preview_widget_active)( + GtkFileChooser *chooser, + gboolean active); +void (*gtk_file_chooser_set_select_multiple)( + GtkFileChooser *chooser, + gboolean select_multiple); +void (*gtk_file_filter_add_pattern)( + GtkFileFilter *filter, + const gchar *pattern); +GtkFileFilter *(*gtk_file_filter_new)(void); +void (*gtk_file_filter_set_name)( + GtkFileFilter *filter, + const gchar *name); +GtkWidget* (*gtk_font_chooser_dialog_new)( + const gchar *title, + GtkWindow *parent); +gchar* (*gtk_font_chooser_get_font)(GtkFontChooser *fontchooser); +GType (*gtk_font_chooser_get_type)(void); +void (*gtk_font_chooser_set_font)( + GtkFontChooser *fontchooser, + const gchar *fontname); +guint32 (*gtk_get_current_event_time)(void); +GType (*gtk_image_get_type)(void); +GtkWidget* (*gtk_image_new)(void); +void (*gtk_image_set_from_pixbuf)(GtkImage *image, GdkPixbuf *pixbuf); +void (*gtk_init)(int *argc, char ***argv); +GType (*gtk_menu_get_type)(void); +GType (*gtk_menu_item_get_type)(void); +GtkWidget* (*gtk_menu_item_new)(void); +void (*gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label); +void (*gtk_menu_item_set_submenu)(GtkMenuItem *menu_item, GtkWidget *submenu); +void (*gtk_menu_item_set_use_underline)( + GtkMenuItem *menu_item, + gboolean setting); +GtkWidget* (*gtk_menu_new)(void); +void (*gtk_menu_popdown)(GtkMenu *menu); +void (*gtk_menu_popup)( + GtkMenu *menu, + GtkWidget *parent_menu_shell, + GtkWidget *parent_menu_item, + GtkMenuPositionFunc func, + gpointer data, + guint button, + guint32 activate_time); +GType (*gtk_menu_shell_get_type)(void); +void (*gtk_menu_shell_insert)( + GtkMenuShell *menu_shell, + GtkWidget *child, + gint position); +void (*gtk_menu_shell_select_item)( + GtkMenuShell *menu_shell, + GtkWidget *menu_item); +GtkWidget* (*gtk_separator_menu_item_new)(void); +GtkSettings* (*gtk_settings_get_default)(void); +void (*gtk_widget_destroy)(GtkWidget *widget); +gint (*gtk_widget_get_scale_factor)(GtkWidget *widget); +GType (*gtk_widget_get_type)(void); +GdkWindow *(*gtk_widget_get_window)(GtkWidget *widget); +void (*gtk_widget_hide)(GtkWidget *widget); +gboolean (*gtk_widget_hide_on_delete)(GtkWidget *widget); +void (*gtk_widget_realize)(GtkWidget *widget); +void (*gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive); +void (*gtk_widget_set_visible)(GtkWidget *widget, gboolean visible); +void (*gtk_widget_show)(GtkWidget *widget); +GType (*gtk_window_get_type)(void); +void (*gtk_window_set_title)(GtkWindow *window, const gchar *title); +void (*pango_font_description_free)(PangoFontDescription *desc); +PangoFontDescription *(*pango_font_description_from_string)(const char *str); +const char *(*pango_font_description_get_family)( + const PangoFontDescription *desc); +gint (*pango_font_description_get_size)(const PangoFontDescription *desc); +PangoStyle (*pango_font_description_get_style)( + const PangoFontDescription *desc); +PangoWeight (*pango_font_description_get_weight)( + const PangoFontDescription *desc); +PangoFontDescription *(*pango_font_description_new)(void); +void (*pango_font_description_set_family)( + PangoFontDescription *desc, + const char *family); +void (*pango_font_description_set_size)( + PangoFontDescription *desc, + gint size); +void (*pango_font_description_set_style)( + PangoFontDescription *desc, + PangoStyle style); +void (*pango_font_description_set_weight)( + PangoFontDescription *desc, + PangoWeight weight); +char *(*pango_font_description_to_string)(const PangoFontDescription *desc); +GType (*pango_font_face_get_type)(void); +GType (*pango_font_family_get_type)(void); + +struct HandleDeleter { + void operator()(void *handle) { + dlclose(handle); + } +}; + +using Handle = std::unique_ptr; + +bool LoadLibrary(Handle &handle, const char *name) { + handle = Handle(dlopen(name, RTLD_LAZY | RTLD_NODELETE)); + if (handle) { + return true; + } + g_warning("Could not load library '%s': %s", name, dlerror()); + return false; +} + +template +inline bool LoadSymbol(const Handle &handle, const char *name, Function &func) { + func = handle + ? reinterpret_cast(dlsym(handle.get(), name)) + : nullptr; + if (const auto error = dlerror()) { + g_warning("Failed to load function '%s': %s", name, error); + } + return (func != nullptr); +} + +bool Resolve() { + static const auto loaded = [&] { + auto lib = Handle(); + return LoadLibrary(lib, "libgtk-3.so.0") + && LOAD_SYMBOL(lib, gdk_pixbuf_new_from_file_at_size) + && LOAD_SYMBOL(lib, gdk_window_focus) + && LOAD_SYMBOL(lib, gdk_window_get_display) + && LOAD_SYMBOL(lib, gdk_window_set_modal_hint) + && LOAD_SYMBOL(lib, gdk_x11_display_get_xdisplay) + && LOAD_SYMBOL(lib, gdk_x11_window_get_type) + && LOAD_SYMBOL(lib, gdk_x11_window_get_xid) + && LOAD_SYMBOL(lib, gtk_accel_label_get_type) + && LOAD_SYMBOL(lib, gtk_accel_label_set_accel) + && LOAD_SYMBOL(lib, gtk_bin_get_child) + && LOAD_SYMBOL(lib, gtk_bin_get_type) + && LOAD_SYMBOL(lib, gtk_button_get_type) + && LOAD_SYMBOL(lib, gtk_button_set_label) + && LOAD_SYMBOL(lib, gtk_check_menu_item_get_active) + && LOAD_SYMBOL(lib, gtk_check_menu_item_get_type) + && LOAD_SYMBOL(lib, gtk_check_menu_item_new) + && LOAD_SYMBOL(lib, gtk_check_menu_item_set_active) + && LOAD_SYMBOL(lib, gtk_check_version) + && LOAD_SYMBOL(lib, gtk_clipboard_get) + && LOAD_SYMBOL(lib, gtk_clipboard_store) + && LOAD_SYMBOL(lib, gtk_color_chooser_dialog_new) + && LOAD_SYMBOL(lib, gtk_color_chooser_get_rgba) + && LOAD_SYMBOL(lib, gtk_color_chooser_get_type) + && LOAD_SYMBOL(lib, gtk_color_chooser_set_rgba) + && LOAD_SYMBOL(lib, gtk_color_chooser_set_use_alpha) + && LOAD_SYMBOL(lib, gtk_container_get_type) + && LOAD_SYMBOL(lib, gtk_container_remove) + && LOAD_SYMBOL(lib, gtk_dialog_get_type) + && LOAD_SYMBOL(lib, gtk_dialog_get_widget_for_response) + && LOAD_SYMBOL(lib, gtk_dialog_run) + && LOAD_SYMBOL(lib, gtk_file_chooser_add_filter) + && LOAD_SYMBOL(lib, gtk_file_chooser_dialog_new) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_current_folder) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_filename) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_filenames) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_filter) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_preview_filename) + && LOAD_SYMBOL(lib, gtk_file_chooser_get_type) + && LOAD_SYMBOL(lib, gtk_file_chooser_remove_filter) + && LOAD_SYMBOL(lib, gtk_file_chooser_select_filename) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_action) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_create_folders) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_current_folder) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_current_name) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_do_overwrite_confirmation) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_filter) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_local_only) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_preview_widget) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_preview_widget_active) + && LOAD_SYMBOL(lib, gtk_file_chooser_set_select_multiple) + && LOAD_SYMBOL(lib, gtk_file_filter_add_pattern) + && LOAD_SYMBOL(lib, gtk_file_filter_new) + && LOAD_SYMBOL(lib, gtk_file_filter_set_name) + && LOAD_SYMBOL(lib, gtk_font_chooser_dialog_new) + && LOAD_SYMBOL(lib, gtk_font_chooser_get_font) + && LOAD_SYMBOL(lib, gtk_font_chooser_get_type) + && LOAD_SYMBOL(lib, gtk_font_chooser_set_font) + && LOAD_SYMBOL(lib, gtk_get_current_event_time) + && LOAD_SYMBOL(lib, gtk_image_get_type) + && LOAD_SYMBOL(lib, gtk_image_new) + && LOAD_SYMBOL(lib, gtk_image_set_from_pixbuf) + && LOAD_SYMBOL(lib, gtk_init) + && LOAD_SYMBOL(lib, gtk_menu_get_type) + && LOAD_SYMBOL(lib, gtk_menu_item_get_type) + && LOAD_SYMBOL(lib, gtk_menu_item_new) + && LOAD_SYMBOL(lib, gtk_menu_item_set_label) + && LOAD_SYMBOL(lib, gtk_menu_item_set_submenu) + && LOAD_SYMBOL(lib, gtk_menu_item_set_use_underline) + && LOAD_SYMBOL(lib, gtk_menu_new) + && LOAD_SYMBOL(lib, gtk_menu_popdown) + && LOAD_SYMBOL(lib, gtk_menu_popup) + && LOAD_SYMBOL(lib, gtk_menu_shell_get_type) + && LOAD_SYMBOL(lib, gtk_menu_shell_insert) + && LOAD_SYMBOL(lib, gtk_menu_shell_select_item) + && LOAD_SYMBOL(lib, gtk_separator_menu_item_new) + && LOAD_SYMBOL(lib, gtk_settings_get_default) + && LOAD_SYMBOL(lib, gtk_widget_destroy) + && LOAD_SYMBOL(lib, gtk_widget_get_scale_factor) + && LOAD_SYMBOL(lib, gtk_widget_get_type) + && LOAD_SYMBOL(lib, gtk_widget_get_window) + && LOAD_SYMBOL(lib, gtk_widget_hide) + && LOAD_SYMBOL(lib, gtk_widget_hide_on_delete) + && LOAD_SYMBOL(lib, gtk_widget_realize) + && LOAD_SYMBOL(lib, gtk_widget_set_sensitive) + && LOAD_SYMBOL(lib, gtk_widget_set_visible) + && LOAD_SYMBOL(lib, gtk_widget_show) + && LOAD_SYMBOL(lib, gtk_window_get_type) + && LOAD_SYMBOL(lib, gtk_window_set_title) + && LOAD_SYMBOL(lib, pango_font_description_free) + && LOAD_SYMBOL(lib, pango_font_description_from_string) + && LOAD_SYMBOL(lib, pango_font_description_get_family) + && LOAD_SYMBOL(lib, pango_font_description_get_size) + && LOAD_SYMBOL(lib, pango_font_description_get_style) + && LOAD_SYMBOL(lib, pango_font_description_get_weight) + && LOAD_SYMBOL(lib, pango_font_description_new) + && LOAD_SYMBOL(lib, pango_font_description_set_family) + && LOAD_SYMBOL(lib, pango_font_description_set_size) + && LOAD_SYMBOL(lib, pango_font_description_set_style) + && LOAD_SYMBOL(lib, pango_font_description_set_weight) + && LOAD_SYMBOL(lib, pango_font_description_to_string) + && LOAD_SYMBOL(lib, pango_font_face_get_type) + && LOAD_SYMBOL(lib, pango_font_family_get_type); + }(); + return loaded; +} + +} // namespace +} // namespace GtkHelper + +GdkPixbuf *gdk_pixbuf_new_from_file_at_size( + const char *filename, + int width, + int height, + GError **error) { + GtkHelper::Resolve(); + return GtkHelper::gdk_pixbuf_new_from_file_at_size( + filename, + width, + height, + error); +} + +void gdk_window_focus(GdkWindow *window, guint32 timestamp) { + GtkHelper::Resolve(); + return GtkHelper::gdk_window_focus(window, timestamp); +} + +GdkDisplay *gdk_window_get_display(GdkWindow *window) { + GtkHelper::Resolve(); + return GtkHelper::gdk_window_get_display(window); +} + +void gdk_window_set_modal_hint(GdkWindow *window, gboolean modal) { + GtkHelper::Resolve(); + GtkHelper::gdk_window_set_modal_hint(window, modal); +} + +Display *gdk_x11_display_get_xdisplay(GdkDisplay *display) { + GtkHelper::Resolve(); + return GtkHelper::gdk_x11_display_get_xdisplay(display); +} + +GType gdk_x11_window_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gdk_x11_window_get_type(); +} + +Window gdk_x11_window_get_xid(GdkWindow *window) { + GtkHelper::Resolve(); + return GtkHelper::gdk_x11_window_get_xid(window); +} + +GType gtk_accel_label_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_accel_label_get_type(); +} + +void gtk_accel_label_set_accel( + GtkAccelLabel *accel_label, + guint accelerator_key, + GdkModifierType accelerator_mods) { + GtkHelper::Resolve(); + GtkHelper::gtk_accel_label_set_accel( + accel_label, + accelerator_key, + accelerator_mods); +} + +GtkWidget *gtk_bin_get_child(GtkBin *bin) { + GtkHelper::Resolve(); + return GtkHelper::gtk_bin_get_child(bin); +} + +GType gtk_bin_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_bin_get_type(); +} + +GType gtk_button_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_button_get_type(); +} + +void gtk_button_set_label(GtkButton *button, const gchar *label) { + GtkHelper::Resolve(); + GtkHelper::gtk_button_set_label(button, label); +} + +gboolean gtk_check_menu_item_get_active(GtkCheckMenuItem *check_menu_item) { + GtkHelper::Resolve(); + return GtkHelper::gtk_check_menu_item_get_active(check_menu_item); +} + +GType gtk_check_menu_item_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_check_menu_item_get_type(); +} + +GtkWidget* gtk_check_menu_item_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_check_menu_item_new(); +} + +void gtk_check_menu_item_set_active( + GtkCheckMenuItem *check_menu_item, + gboolean is_active) { + GtkHelper::Resolve(); + return GtkHelper::gtk_check_menu_item_set_active( + check_menu_item, + is_active); +} + +const gchar *gtk_check_version( + guint required_major, + guint required_minor, + guint required_micro) { + GtkHelper::Resolve(); + return GtkHelper::gtk_check_version( + required_major, + required_minor, + required_micro); +} + +GtkClipboard *gtk_clipboard_get(GdkAtom selection) { + GtkHelper::Resolve(); + return GtkHelper::gtk_clipboard_get(selection); +} + +void gtk_clipboard_store(GtkClipboard *clipboard) { + GtkHelper::Resolve(); + GtkHelper::gtk_clipboard_store(clipboard); +} + +GtkWidget *gtk_color_chooser_dialog_new( + const gchar *title, + GtkWindow *parent) { + GtkHelper::Resolve(); + return GtkHelper::gtk_color_chooser_dialog_new(title, parent); +} + +GType gtk_color_chooser_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_color_chooser_get_type(); +} + +void gtk_color_chooser_get_rgba( + GtkColorChooser *chooser, + GdkRGBA *color) { + GtkHelper::Resolve(); + GtkHelper::gtk_color_chooser_get_rgba(chooser, color); +} + +void gtk_color_chooser_set_rgba( + GtkColorChooser *chooser, + const GdkRGBA *color) { + GtkHelper::Resolve(); + GtkHelper::gtk_color_chooser_set_rgba(chooser, color); +} + +void gtk_color_chooser_set_use_alpha( + GtkColorChooser *chooser, + gboolean use_alpha) { + GtkHelper::Resolve(); + GtkHelper::gtk_color_chooser_set_use_alpha(chooser, use_alpha); +} + +GType gtk_container_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_container_get_type(); +} + +void gtk_container_remove(GtkContainer *container, GtkWidget *widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_container_remove(container, widget); +} + +GType gtk_dialog_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_dialog_get_type(); +} + +GtkWidget* gtk_dialog_get_widget_for_response( + GtkDialog *dialog, + gint response_id) { + GtkHelper::Resolve(); + return GtkHelper::gtk_dialog_get_widget_for_response( + dialog, + response_id); +} + +gint gtk_dialog_run(GtkDialog *dialog) { + GtkHelper::Resolve(); + return GtkHelper::gtk_dialog_run(dialog); +} + +void gtk_file_chooser_add_filter( + GtkFileChooser *chooser, + GtkFileFilter *filter) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_add_filter(chooser, filter); +} + +GtkWidget *gtk_file_chooser_dialog_new( + const gchar *title, + GtkWindow *parent, + GtkFileChooserAction action, + const gchar *first_button_text, + ...) { + GtkHelper::Resolve(); + __builtin_return( + __builtin_apply( + reinterpret_cast( + GtkHelper::gtk_file_chooser_dialog_new), + __builtin_apply_args(), + 1000)); +} + +gchar *gtk_file_chooser_get_current_folder(GtkFileChooser *chooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_current_folder(chooser); +} + +gchar *gtk_file_chooser_get_filename(GtkFileChooser *chooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_filename(chooser); +} + +GSList *gtk_file_chooser_get_filenames(GtkFileChooser *chooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_filenames(chooser); +} + +GtkFileFilter *gtk_file_chooser_get_filter(GtkFileChooser *chooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_filter(chooser); +} + +char *gtk_file_chooser_get_preview_filename(GtkFileChooser *chooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_preview_filename(chooser); +} + +GType gtk_file_chooser_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_get_type(); +} + +void gtk_file_chooser_remove_filter( + GtkFileChooser *chooser, + GtkFileFilter *filter) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_remove_filter(chooser, filter); +} + +gboolean gtk_file_chooser_select_filename( + GtkFileChooser *chooser, + const char *filename) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_select_filename(chooser, filename); +} + +void gtk_file_chooser_set_action( + GtkFileChooser *chooser, + GtkFileChooserAction action) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_action(chooser, action); +} + +void gtk_file_chooser_set_create_folders( + GtkFileChooser *chooser, + gboolean create_folders) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_create_folders( + chooser, + create_folders); +} + +gboolean gtk_file_chooser_set_current_folder( + GtkFileChooser *chooser, + const gchar *filename) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_chooser_set_current_folder(chooser, filename); +} + +void gtk_file_chooser_set_current_name( + GtkFileChooser *chooser, + const gchar *name) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_current_name(chooser, name); +} + +void gtk_file_chooser_set_do_overwrite_confirmation( + GtkFileChooser *chooser, + gboolean do_overwrite_confirmation) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_do_overwrite_confirmation( + chooser, + do_overwrite_confirmation); +} + +void gtk_file_chooser_set_filter( + GtkFileChooser *chooser, + GtkFileFilter *filter) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_filter(chooser, filter); +} + +void gtk_file_chooser_set_local_only( + GtkFileChooser *chooser, + gboolean local_only) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_local_only(chooser, local_only); +} + +void gtk_file_chooser_set_preview_widget( + GtkFileChooser *chooser, + GtkWidget *preview_widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_preview_widget(chooser, preview_widget); +} + +void gtk_file_chooser_set_preview_widget_active( + GtkFileChooser *chooser, + gboolean active) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_preview_widget_active(chooser, active); +} + +void gtk_file_chooser_set_select_multiple( + GtkFileChooser *chooser, + gboolean select_multiple) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_chooser_set_select_multiple(chooser, select_multiple); +} + +void gtk_file_filter_add_pattern( + GtkFileFilter *filter, + const gchar *pattern) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_filter_add_pattern(filter, pattern); +} + +GtkFileFilter *gtk_file_filter_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_file_filter_new(); +} + +void gtk_file_filter_set_name( + GtkFileFilter *filter, + const gchar *name) { + GtkHelper::Resolve(); + GtkHelper::gtk_file_filter_set_name(filter, name); +} + +GtkWidget* gtk_font_chooser_dialog_new( + const gchar *title, + GtkWindow *parent) { + GtkHelper::Resolve(); + return GtkHelper::gtk_font_chooser_dialog_new(title, parent); +} + +gchar* gtk_font_chooser_get_font(GtkFontChooser *fontchooser) { + GtkHelper::Resolve(); + return GtkHelper::gtk_font_chooser_get_font(fontchooser); +} + +GType gtk_font_chooser_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_font_chooser_get_type(); +} + +void gtk_font_chooser_set_font( + GtkFontChooser *fontchooser, + const gchar *fontname) { + GtkHelper::Resolve(); + GtkHelper::gtk_font_chooser_set_font(fontchooser, fontname); +} + +guint32 gtk_get_current_event_time(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_get_current_event_time(); +} + +GType gtk_image_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_image_get_type(); +} + +GtkWidget* gtk_image_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_image_new(); +} + +void gtk_image_set_from_pixbuf(GtkImage *image, GdkPixbuf *pixbuf) { + GtkHelper::Resolve(); + GtkHelper::gtk_image_set_from_pixbuf(image, pixbuf); +} + +void gtk_init(int *argc, char ***argv) { + GtkHelper::Resolve(); + GtkHelper::gtk_init(argc, argv); +} + +GType gtk_menu_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_menu_get_type(); +} + +GType gtk_menu_item_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_menu_item_get_type(); +} + +GtkWidget* gtk_menu_item_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_menu_item_new(); +} + +void gtk_menu_item_set_label(GtkMenuItem *menu_item, const gchar *label) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_item_set_label(menu_item, label); +} + +void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_item_set_submenu(menu_item, submenu); +} + +void gtk_menu_item_set_use_underline( + GtkMenuItem *menu_item, + gboolean setting) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_item_set_use_underline(menu_item, setting); +} + +GtkWidget* gtk_menu_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_menu_new(); +} + +void gtk_menu_popdown(GtkMenu *menu) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_popdown(menu); +} + +void gtk_menu_popup( + GtkMenu *menu, + GtkWidget *parent_menu_shell, + GtkWidget *parent_menu_item, + GtkMenuPositionFunc func, + gpointer data, + guint button, + guint32 activate_time) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_popup( + menu, + parent_menu_shell, + parent_menu_item, + func, + data, + button, + activate_time); +} + +GType gtk_menu_shell_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_menu_shell_get_type(); +} +void gtk_menu_shell_insert( + GtkMenuShell *menu_shell, + GtkWidget *child, + gint position) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_shell_insert(menu_shell, child, position); +} + +void gtk_menu_shell_select_item( + GtkMenuShell *menu_shell, + GtkWidget *menu_item) { + GtkHelper::Resolve(); + GtkHelper::gtk_menu_shell_select_item(menu_shell, menu_item); +} + +GtkWidget* gtk_separator_menu_item_new(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_separator_menu_item_new(); +} + +GtkSettings* gtk_settings_get_default(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_settings_get_default(); +} + +void gtk_widget_destroy(GtkWidget *widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_destroy(widget); +} + +gint gtk_widget_get_scale_factor(GtkWidget *widget) { + GtkHelper::Resolve(); + return GtkHelper::gtk_widget_get_scale_factor(widget); +} + +GType gtk_widget_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_widget_get_type(); +} + +GdkWindow *gtk_widget_get_window(GtkWidget *widget) { + GtkHelper::Resolve(); + return GtkHelper::gtk_widget_get_window(widget); +} + +void gtk_widget_hide(GtkWidget *widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_hide(widget); +} + +gboolean gtk_widget_hide_on_delete(GtkWidget *widget) { + GtkHelper::Resolve(); + return GtkHelper::gtk_widget_hide_on_delete(widget); +} + +void gtk_widget_realize(GtkWidget *widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_realize(widget); +} + +void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_set_sensitive(widget, sensitive); +} + +void gtk_widget_set_visible(GtkWidget *widget, gboolean visible) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_set_visible(widget, visible); +} + +void gtk_widget_show(GtkWidget *widget) { + GtkHelper::Resolve(); + GtkHelper::gtk_widget_show(widget); +} + +GType gtk_window_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::gtk_window_get_type(); +} + +void gtk_window_set_title(GtkWindow *window, const gchar *title) { + GtkHelper::Resolve(); + GtkHelper::gtk_window_set_title(window, title); +} + +void pango_font_description_free(PangoFontDescription *desc) { + GtkHelper::Resolve(); + GtkHelper::pango_font_description_free(desc); +} + +PangoFontDescription *pango_font_description_from_string(const char *str) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_from_string(str); +} + +const char *pango_font_description_get_family( + const PangoFontDescription *desc) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_get_family(desc); +} + +gint pango_font_description_get_size(const PangoFontDescription *desc) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_get_size(desc); +} + +PangoStyle pango_font_description_get_style( + const PangoFontDescription *desc) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_get_style(desc); +} + +PangoWeight pango_font_description_get_weight( + const PangoFontDescription *desc) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_get_weight(desc); +} + +PangoFontDescription *pango_font_description_new(void) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_new(); +} + +void pango_font_description_set_family( + PangoFontDescription *desc, + const char *family) { + GtkHelper::Resolve(); + GtkHelper::pango_font_description_set_family(desc, family); +} + +void pango_font_description_set_size( + PangoFontDescription *desc, + gint size) { + GtkHelper::Resolve(); + GtkHelper::pango_font_description_set_size(desc, size); +} + +void pango_font_description_set_style( + PangoFontDescription *desc, + PangoStyle style) { + GtkHelper::Resolve(); + GtkHelper::pango_font_description_set_style(desc, style); +} + +void pango_font_description_set_weight( + PangoFontDescription *desc, + PangoWeight weight) { + GtkHelper::Resolve(); + GtkHelper::pango_font_description_set_weight(desc, weight); +} + +char *pango_font_description_to_string(const PangoFontDescription *desc) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_description_to_string(desc); +} + +GType pango_font_face_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_face_get_type(); +} + +GType pango_font_family_get_type(void) { + GtkHelper::Resolve(); + return GtkHelper::pango_font_family_get_type(); +}