1 // This file is part of Desktop App Toolkit,
2 // a set of libraries for developing nice desktop applications.
3 //
4 // For license and copyright information please follow this link:
5 // https://github.com/desktop-app/legal/blob/master/LEGAL
6 //
7 #include <dlfcn.h>
8 #include <gdk/gdkx.h>
9 #include <gtk/gtk.h>
10 #include <memory>
11 #include <iostream>
12
13 #define LOAD_SYMBOL(handle, func) LoadSymbol(handle, #func, func)
14
15 namespace GtkHelper {
16 namespace {
17
18 GdkPixbuf *(*gdk_pixbuf_new_from_file_at_size)(
19 const char *filename,
20 int width,
21 int height,
22 GError **error);
23 void (*gdk_window_focus)(GdkWindow *window, guint32 timestamp);
24 GdkDisplay *(*gdk_window_get_display)(GdkWindow *window);
25 void (*gdk_window_set_modal_hint)(GdkWindow *window, gboolean modal);
26 Display *(*gdk_x11_display_get_xdisplay)(GdkDisplay *display);
27 GType (*gdk_x11_window_get_type)(void);
28 Window (*gdk_x11_window_get_xid)(GdkWindow *window);
29 GType (*gtk_accel_label_get_type)(void);
30 void (*gtk_accel_label_set_accel)(
31 GtkAccelLabel *accel_label,
32 guint accelerator_key,
33 GdkModifierType accelerator_mods);
34 GtkWidget *(*gtk_bin_get_child)(GtkBin *bin);
35 GType (*gtk_bin_get_type)(void);
36 GType (*gtk_button_get_type)(void);
37 void (*gtk_button_set_label)(GtkButton *button, const gchar *label);
38 gboolean (*gtk_check_menu_item_get_active)(GtkCheckMenuItem *check_menu_item);
39 GType (*gtk_check_menu_item_get_type)(void);
40 GtkWidget* (*gtk_check_menu_item_new)(void);
41 void (*gtk_check_menu_item_set_active)(
42 GtkCheckMenuItem *check_menu_item,
43 gboolean is_active);
44 const gchar *(*gtk_check_version)(
45 guint required_major,
46 guint required_minor,
47 guint required_micro);
48 GtkClipboard *(*gtk_clipboard_get)(GdkAtom selection);
49 void (*gtk_clipboard_store)(GtkClipboard *clipboard);
50 GtkWidget *(*gtk_color_chooser_dialog_new)(
51 const gchar *title,
52 GtkWindow *parent);
53 GType (*gtk_color_chooser_get_type)(void);
54 void (*gtk_color_chooser_get_rgba)(
55 GtkColorChooser *chooser,
56 GdkRGBA *color);
57 void (*gtk_color_chooser_set_rgba)(
58 GtkColorChooser *chooser,
59 const GdkRGBA *color);
60 void (*gtk_color_chooser_set_use_alpha)(
61 GtkColorChooser *chooser,
62 gboolean use_alpha);
63 GType (*gtk_container_get_type)(void);
64 void (*gtk_container_remove)(GtkContainer *container, GtkWidget *widget);
65 GtkWidget *(*gtk_dialog_add_button)(
66 GtkDialog *dialog,
67 const gchar *button_text,
68 gint response_id);
69 GType (*gtk_dialog_get_type)(void);
70 GtkWidget* (*gtk_dialog_get_widget_for_response)(
71 GtkDialog *dialog,
72 gint response_id);
73 gint (*gtk_dialog_run)(GtkDialog *dialog);
74 void (*gtk_file_chooser_add_filter)(
75 GtkFileChooser *chooser,
76 GtkFileFilter *filter);
77 GType (*gtk_file_chooser_dialog_get_type)(void);
78 gchar *(*gtk_file_chooser_get_current_folder)(GtkFileChooser *chooser);
79 gchar *(*gtk_file_chooser_get_filename)(GtkFileChooser *chooser);
80 GSList *(*gtk_file_chooser_get_filenames)(GtkFileChooser *chooser);
81 GtkFileFilter *(*gtk_file_chooser_get_filter)(GtkFileChooser *chooser);
82 char *(*gtk_file_chooser_get_preview_filename)(GtkFileChooser *chooser);
83 GType (*gtk_file_chooser_get_type)(void);
84 void (*gtk_file_chooser_remove_filter)(
85 GtkFileChooser *chooser,
86 GtkFileFilter *filter);
87 gboolean (*gtk_file_chooser_select_filename)(
88 GtkFileChooser *chooser,
89 const char *filename);
90 void (*gtk_file_chooser_set_action)(
91 GtkFileChooser *chooser,
92 GtkFileChooserAction action);
93 void (*gtk_file_chooser_set_create_folders)(
94 GtkFileChooser *chooser,
95 gboolean create_folders);
96 gboolean (*gtk_file_chooser_set_current_folder)(
97 GtkFileChooser *chooser,
98 const gchar *filename);
99 void (*gtk_file_chooser_set_current_name)(
100 GtkFileChooser *chooser,
101 const gchar *name);
102 void (*gtk_file_chooser_set_do_overwrite_confirmation)(
103 GtkFileChooser *chooser,
104 gboolean do_overwrite_confirmation);
105 void (*gtk_file_chooser_set_filter)(
106 GtkFileChooser *chooser,
107 GtkFileFilter *filter);
108 void (*gtk_file_chooser_set_local_only)(
109 GtkFileChooser *chooser,
110 gboolean local_only);
111 void (*gtk_file_chooser_set_preview_widget)(
112 GtkFileChooser *chooser,
113 GtkWidget *preview_widget);
114 void (*gtk_file_chooser_set_preview_widget_active)(
115 GtkFileChooser *chooser,
116 gboolean active);
117 void (*gtk_file_chooser_set_select_multiple)(
118 GtkFileChooser *chooser,
119 gboolean select_multiple);
120 void (*gtk_file_filter_add_pattern)(
121 GtkFileFilter *filter,
122 const gchar *pattern);
123 GtkFileFilter *(*gtk_file_filter_new)(void);
124 void (*gtk_file_filter_set_name)(
125 GtkFileFilter *filter,
126 const gchar *name);
127 GtkWidget* (*gtk_font_chooser_dialog_new)(
128 const gchar *title,
129 GtkWindow *parent);
130 gchar* (*gtk_font_chooser_get_font)(GtkFontChooser *fontchooser);
131 GType (*gtk_font_chooser_get_type)(void);
132 void (*gtk_font_chooser_set_font)(
133 GtkFontChooser *fontchooser,
134 const gchar *fontname);
135 guint32 (*gtk_get_current_event_time)(void);
136 GType (*gtk_image_get_type)(void);
137 GtkWidget* (*gtk_image_new)(void);
138 void (*gtk_image_set_from_pixbuf)(GtkImage *image, GdkPixbuf *pixbuf);
139 void (*gtk_init)(int *argc, char ***argv);
140 GType (*gtk_menu_get_type)(void);
141 GType (*gtk_menu_item_get_type)(void);
142 GtkWidget* (*gtk_menu_item_new)(void);
143 void (*gtk_menu_item_set_label)(GtkMenuItem *menu_item, const gchar *label);
144 void (*gtk_menu_item_set_submenu)(GtkMenuItem *menu_item, GtkWidget *submenu);
145 void (*gtk_menu_item_set_use_underline)(
146 GtkMenuItem *menu_item,
147 gboolean setting);
148 GtkWidget* (*gtk_menu_new)(void);
149 void (*gtk_menu_popdown)(GtkMenu *menu);
150 void (*gtk_menu_popup)(
151 GtkMenu *menu,
152 GtkWidget *parent_menu_shell,
153 GtkWidget *parent_menu_item,
154 GtkMenuPositionFunc func,
155 gpointer data,
156 guint button,
157 guint32 activate_time);
158 GType (*gtk_menu_shell_get_type)(void);
159 void (*gtk_menu_shell_insert)(
160 GtkMenuShell *menu_shell,
161 GtkWidget *child,
162 gint position);
163 void (*gtk_menu_shell_select_item)(
164 GtkMenuShell *menu_shell,
165 GtkWidget *menu_item);
166 GtkWidget* (*gtk_separator_menu_item_new)(void);
167 GtkSettings* (*gtk_settings_get_default)(void);
168 void (*gtk_widget_destroy)(GtkWidget *widget);
169 gint (*gtk_widget_get_scale_factor)(GtkWidget *widget);
170 GType (*gtk_widget_get_type)(void);
171 GdkWindow *(*gtk_widget_get_window)(GtkWidget *widget);
172 void (*gtk_widget_hide)(GtkWidget *widget);
173 gboolean (*gtk_widget_hide_on_delete)(GtkWidget *widget);
174 void (*gtk_widget_realize)(GtkWidget *widget);
175 void (*gtk_widget_set_sensitive)(GtkWidget *widget, gboolean sensitive);
176 void (*gtk_widget_set_visible)(GtkWidget *widget, gboolean visible);
177 void (*gtk_widget_show)(GtkWidget *widget);
178 GType (*gtk_window_get_type)(void);
179 void (*gtk_window_set_title)(GtkWindow *window, const gchar *title);
180 void (*gtk_window_set_transient_for)(GtkWindow *window, GtkWindow *parent);
181 void (*pango_font_description_free)(PangoFontDescription *desc);
182 PangoFontDescription *(*pango_font_description_from_string)(const char *str);
183 const char *(*pango_font_description_get_family)(
184 const PangoFontDescription *desc);
185 gint (*pango_font_description_get_size)(const PangoFontDescription *desc);
186 PangoStyle (*pango_font_description_get_style)(
187 const PangoFontDescription *desc);
188 PangoWeight (*pango_font_description_get_weight)(
189 const PangoFontDescription *desc);
190 PangoFontDescription *(*pango_font_description_new)(void);
191 void (*pango_font_description_set_family)(
192 PangoFontDescription *desc,
193 const char *family);
194 void (*pango_font_description_set_size)(
195 PangoFontDescription *desc,
196 gint size);
197 void (*pango_font_description_set_style)(
198 PangoFontDescription *desc,
199 PangoStyle style);
200 void (*pango_font_description_set_weight)(
201 PangoFontDescription *desc,
202 PangoWeight weight);
203 char *(*pango_font_description_to_string)(const PangoFontDescription *desc);
204 GType (*pango_font_face_get_type)(void);
205 GType (*pango_font_family_get_type)(void);
206
207 struct HandleDeleter {
operator ()GtkHelper::__anon47dc7fe20111::HandleDeleter208 void operator()(void *handle) {
209 dlclose(handle);
210 }
211 };
212
213 using Handle = std::unique_ptr<void, HandleDeleter>;
214
LoadLibrary(Handle & handle,const char * name)215 bool LoadLibrary(Handle &handle, const char *name) {
216 handle = Handle(dlopen(name, RTLD_LAZY | RTLD_NODELETE));
217 if (handle) {
218 return true;
219 }
220 std::cerr << dlerror() << std::endl;
221 return false;
222 }
223
224 template <typename Function>
LoadSymbol(const Handle & handle,const char * name,Function & func)225 inline bool LoadSymbol(const Handle &handle, const char *name, Function &func) {
226 func = handle
227 ? reinterpret_cast<Function>(dlsym(handle.get(), name))
228 : nullptr;
229 if (const auto error = dlerror()) {
230 std::cerr << error << std::endl;
231 }
232 return (func != nullptr);
233 }
234
Resolve()235 bool Resolve() {
236 static const auto loaded = [&] {
237 auto lib = Handle();
238 return LoadLibrary(lib, "libgtk-3.so.0")
239 && LOAD_SYMBOL(lib, gdk_pixbuf_new_from_file_at_size)
240 && LOAD_SYMBOL(lib, gdk_window_focus)
241 && LOAD_SYMBOL(lib, gdk_window_get_display)
242 && LOAD_SYMBOL(lib, gdk_window_set_modal_hint)
243 && LOAD_SYMBOL(lib, gdk_x11_display_get_xdisplay)
244 && LOAD_SYMBOL(lib, gdk_x11_window_get_type)
245 && LOAD_SYMBOL(lib, gdk_x11_window_get_xid)
246 && LOAD_SYMBOL(lib, gtk_accel_label_get_type)
247 && LOAD_SYMBOL(lib, gtk_accel_label_set_accel)
248 && LOAD_SYMBOL(lib, gtk_bin_get_child)
249 && LOAD_SYMBOL(lib, gtk_bin_get_type)
250 && LOAD_SYMBOL(lib, gtk_button_get_type)
251 && LOAD_SYMBOL(lib, gtk_button_set_label)
252 && LOAD_SYMBOL(lib, gtk_check_menu_item_get_active)
253 && LOAD_SYMBOL(lib, gtk_check_menu_item_get_type)
254 && LOAD_SYMBOL(lib, gtk_check_menu_item_new)
255 && LOAD_SYMBOL(lib, gtk_check_menu_item_set_active)
256 && LOAD_SYMBOL(lib, gtk_check_version)
257 && LOAD_SYMBOL(lib, gtk_clipboard_get)
258 && LOAD_SYMBOL(lib, gtk_clipboard_store)
259 && LOAD_SYMBOL(lib, gtk_color_chooser_dialog_new)
260 && LOAD_SYMBOL(lib, gtk_color_chooser_get_rgba)
261 && LOAD_SYMBOL(lib, gtk_color_chooser_get_type)
262 && LOAD_SYMBOL(lib, gtk_color_chooser_set_rgba)
263 && LOAD_SYMBOL(lib, gtk_color_chooser_set_use_alpha)
264 && LOAD_SYMBOL(lib, gtk_container_get_type)
265 && LOAD_SYMBOL(lib, gtk_container_remove)
266 && LOAD_SYMBOL(lib, gtk_dialog_add_button)
267 && LOAD_SYMBOL(lib, gtk_dialog_get_type)
268 && LOAD_SYMBOL(lib, gtk_dialog_get_widget_for_response)
269 && LOAD_SYMBOL(lib, gtk_dialog_run)
270 && LOAD_SYMBOL(lib, gtk_file_chooser_add_filter)
271 && LOAD_SYMBOL(lib, gtk_file_chooser_dialog_get_type)
272 && LOAD_SYMBOL(lib, gtk_file_chooser_get_current_folder)
273 && LOAD_SYMBOL(lib, gtk_file_chooser_get_filename)
274 && LOAD_SYMBOL(lib, gtk_file_chooser_get_filenames)
275 && LOAD_SYMBOL(lib, gtk_file_chooser_get_filter)
276 && LOAD_SYMBOL(lib, gtk_file_chooser_get_preview_filename)
277 && LOAD_SYMBOL(lib, gtk_file_chooser_get_type)
278 && LOAD_SYMBOL(lib, gtk_file_chooser_remove_filter)
279 && LOAD_SYMBOL(lib, gtk_file_chooser_select_filename)
280 && LOAD_SYMBOL(lib, gtk_file_chooser_set_action)
281 && LOAD_SYMBOL(lib, gtk_file_chooser_set_create_folders)
282 && LOAD_SYMBOL(lib, gtk_file_chooser_set_current_folder)
283 && LOAD_SYMBOL(lib, gtk_file_chooser_set_current_name)
284 && LOAD_SYMBOL(lib, gtk_file_chooser_set_do_overwrite_confirmation)
285 && LOAD_SYMBOL(lib, gtk_file_chooser_set_filter)
286 && LOAD_SYMBOL(lib, gtk_file_chooser_set_local_only)
287 && LOAD_SYMBOL(lib, gtk_file_chooser_set_preview_widget)
288 && LOAD_SYMBOL(lib, gtk_file_chooser_set_preview_widget_active)
289 && LOAD_SYMBOL(lib, gtk_file_chooser_set_select_multiple)
290 && LOAD_SYMBOL(lib, gtk_file_filter_add_pattern)
291 && LOAD_SYMBOL(lib, gtk_file_filter_new)
292 && LOAD_SYMBOL(lib, gtk_file_filter_set_name)
293 && LOAD_SYMBOL(lib, gtk_font_chooser_dialog_new)
294 && LOAD_SYMBOL(lib, gtk_font_chooser_get_font)
295 && LOAD_SYMBOL(lib, gtk_font_chooser_get_type)
296 && LOAD_SYMBOL(lib, gtk_font_chooser_set_font)
297 && LOAD_SYMBOL(lib, gtk_get_current_event_time)
298 && LOAD_SYMBOL(lib, gtk_image_get_type)
299 && LOAD_SYMBOL(lib, gtk_image_new)
300 && LOAD_SYMBOL(lib, gtk_image_set_from_pixbuf)
301 && LOAD_SYMBOL(lib, gtk_init)
302 && LOAD_SYMBOL(lib, gtk_menu_get_type)
303 && LOAD_SYMBOL(lib, gtk_menu_item_get_type)
304 && LOAD_SYMBOL(lib, gtk_menu_item_new)
305 && LOAD_SYMBOL(lib, gtk_menu_item_set_label)
306 && LOAD_SYMBOL(lib, gtk_menu_item_set_submenu)
307 && LOAD_SYMBOL(lib, gtk_menu_item_set_use_underline)
308 && LOAD_SYMBOL(lib, gtk_menu_new)
309 && LOAD_SYMBOL(lib, gtk_menu_popdown)
310 && LOAD_SYMBOL(lib, gtk_menu_popup)
311 && LOAD_SYMBOL(lib, gtk_menu_shell_get_type)
312 && LOAD_SYMBOL(lib, gtk_menu_shell_insert)
313 && LOAD_SYMBOL(lib, gtk_menu_shell_select_item)
314 && LOAD_SYMBOL(lib, gtk_separator_menu_item_new)
315 && LOAD_SYMBOL(lib, gtk_settings_get_default)
316 && LOAD_SYMBOL(lib, gtk_widget_destroy)
317 && LOAD_SYMBOL(lib, gtk_widget_get_scale_factor)
318 && LOAD_SYMBOL(lib, gtk_widget_get_type)
319 && LOAD_SYMBOL(lib, gtk_widget_get_window)
320 && LOAD_SYMBOL(lib, gtk_widget_hide)
321 && LOAD_SYMBOL(lib, gtk_widget_hide_on_delete)
322 && LOAD_SYMBOL(lib, gtk_widget_realize)
323 && LOAD_SYMBOL(lib, gtk_widget_set_sensitive)
324 && LOAD_SYMBOL(lib, gtk_widget_set_visible)
325 && LOAD_SYMBOL(lib, gtk_widget_show)
326 && LOAD_SYMBOL(lib, gtk_window_get_type)
327 && LOAD_SYMBOL(lib, gtk_window_set_title)
328 && LOAD_SYMBOL(lib, gtk_window_set_transient_for)
329 && LOAD_SYMBOL(lib, pango_font_description_free)
330 && LOAD_SYMBOL(lib, pango_font_description_from_string)
331 && LOAD_SYMBOL(lib, pango_font_description_get_family)
332 && LOAD_SYMBOL(lib, pango_font_description_get_size)
333 && LOAD_SYMBOL(lib, pango_font_description_get_style)
334 && LOAD_SYMBOL(lib, pango_font_description_get_weight)
335 && LOAD_SYMBOL(lib, pango_font_description_new)
336 && LOAD_SYMBOL(lib, pango_font_description_set_family)
337 && LOAD_SYMBOL(lib, pango_font_description_set_size)
338 && LOAD_SYMBOL(lib, pango_font_description_set_style)
339 && LOAD_SYMBOL(lib, pango_font_description_set_weight)
340 && LOAD_SYMBOL(lib, pango_font_description_to_string)
341 && LOAD_SYMBOL(lib, pango_font_face_get_type)
342 && LOAD_SYMBOL(lib, pango_font_family_get_type);
343 }();
344 return loaded;
345 }
346
347 } // namespace
348 } // namespace GtkHelper
349
gdk_pixbuf_new_from_file_at_size(const char * filename,int width,int height,GError ** error)350 GdkPixbuf *gdk_pixbuf_new_from_file_at_size(
351 const char *filename,
352 int width,
353 int height,
354 GError **error) {
355 GtkHelper::Resolve();
356 return GtkHelper::gdk_pixbuf_new_from_file_at_size(
357 filename,
358 width,
359 height,
360 error);
361 }
362
gdk_window_focus(GdkWindow * window,guint32 timestamp)363 void gdk_window_focus(GdkWindow *window, guint32 timestamp) {
364 GtkHelper::Resolve();
365 return GtkHelper::gdk_window_focus(window, timestamp);
366 }
367
gdk_window_get_display(GdkWindow * window)368 GdkDisplay *gdk_window_get_display(GdkWindow *window) {
369 GtkHelper::Resolve();
370 return GtkHelper::gdk_window_get_display(window);
371 }
372
gdk_window_set_modal_hint(GdkWindow * window,gboolean modal)373 void gdk_window_set_modal_hint(GdkWindow *window, gboolean modal) {
374 GtkHelper::Resolve();
375 GtkHelper::gdk_window_set_modal_hint(window, modal);
376 }
377
gdk_x11_display_get_xdisplay(GdkDisplay * display)378 Display *gdk_x11_display_get_xdisplay(GdkDisplay *display) {
379 GtkHelper::Resolve();
380 return GtkHelper::gdk_x11_display_get_xdisplay(display);
381 }
382
gdk_x11_window_get_type(void)383 GType gdk_x11_window_get_type(void) {
384 GtkHelper::Resolve();
385 return GtkHelper::gdk_x11_window_get_type();
386 }
387
gdk_x11_window_get_xid(GdkWindow * window)388 Window gdk_x11_window_get_xid(GdkWindow *window) {
389 GtkHelper::Resolve();
390 return GtkHelper::gdk_x11_window_get_xid(window);
391 }
392
gtk_accel_label_get_type(void)393 GType gtk_accel_label_get_type(void) {
394 GtkHelper::Resolve();
395 return GtkHelper::gtk_accel_label_get_type();
396 }
397
gtk_accel_label_set_accel(GtkAccelLabel * accel_label,guint accelerator_key,GdkModifierType accelerator_mods)398 void gtk_accel_label_set_accel(
399 GtkAccelLabel *accel_label,
400 guint accelerator_key,
401 GdkModifierType accelerator_mods) {
402 GtkHelper::Resolve();
403 GtkHelper::gtk_accel_label_set_accel(
404 accel_label,
405 accelerator_key,
406 accelerator_mods);
407 }
408
gtk_bin_get_child(GtkBin * bin)409 GtkWidget *gtk_bin_get_child(GtkBin *bin) {
410 GtkHelper::Resolve();
411 return GtkHelper::gtk_bin_get_child(bin);
412 }
413
gtk_bin_get_type(void)414 GType gtk_bin_get_type(void) {
415 GtkHelper::Resolve();
416 return GtkHelper::gtk_bin_get_type();
417 }
418
gtk_button_get_type(void)419 GType gtk_button_get_type(void) {
420 GtkHelper::Resolve();
421 return GtkHelper::gtk_button_get_type();
422 }
423
gtk_button_set_label(GtkButton * button,const gchar * label)424 void gtk_button_set_label(GtkButton *button, const gchar *label) {
425 GtkHelper::Resolve();
426 GtkHelper::gtk_button_set_label(button, label);
427 }
428
gtk_check_menu_item_get_active(GtkCheckMenuItem * check_menu_item)429 gboolean gtk_check_menu_item_get_active(GtkCheckMenuItem *check_menu_item) {
430 GtkHelper::Resolve();
431 return GtkHelper::gtk_check_menu_item_get_active(check_menu_item);
432 }
433
gtk_check_menu_item_get_type(void)434 GType gtk_check_menu_item_get_type(void) {
435 GtkHelper::Resolve();
436 return GtkHelper::gtk_check_menu_item_get_type();
437 }
438
gtk_check_menu_item_new(void)439 GtkWidget* gtk_check_menu_item_new(void) {
440 GtkHelper::Resolve();
441 return GtkHelper::gtk_check_menu_item_new();
442 }
443
gtk_check_menu_item_set_active(GtkCheckMenuItem * check_menu_item,gboolean is_active)444 void gtk_check_menu_item_set_active(
445 GtkCheckMenuItem *check_menu_item,
446 gboolean is_active) {
447 GtkHelper::Resolve();
448 return GtkHelper::gtk_check_menu_item_set_active(
449 check_menu_item,
450 is_active);
451 }
452
gtk_check_version(guint required_major,guint required_minor,guint required_micro)453 const gchar *gtk_check_version(
454 guint required_major,
455 guint required_minor,
456 guint required_micro) {
457 GtkHelper::Resolve();
458 return GtkHelper::gtk_check_version(
459 required_major,
460 required_minor,
461 required_micro);
462 }
463
gtk_clipboard_get(GdkAtom selection)464 GtkClipboard *gtk_clipboard_get(GdkAtom selection) {
465 GtkHelper::Resolve();
466 return GtkHelper::gtk_clipboard_get(selection);
467 }
468
gtk_clipboard_store(GtkClipboard * clipboard)469 void gtk_clipboard_store(GtkClipboard *clipboard) {
470 GtkHelper::Resolve();
471 GtkHelper::gtk_clipboard_store(clipboard);
472 }
473
gtk_color_chooser_dialog_new(const gchar * title,GtkWindow * parent)474 GtkWidget *gtk_color_chooser_dialog_new(
475 const gchar *title,
476 GtkWindow *parent) {
477 GtkHelper::Resolve();
478 return GtkHelper::gtk_color_chooser_dialog_new(title, parent);
479 }
480
gtk_color_chooser_get_type(void)481 GType gtk_color_chooser_get_type(void) {
482 GtkHelper::Resolve();
483 return GtkHelper::gtk_color_chooser_get_type();
484 }
485
gtk_color_chooser_get_rgba(GtkColorChooser * chooser,GdkRGBA * color)486 void gtk_color_chooser_get_rgba(
487 GtkColorChooser *chooser,
488 GdkRGBA *color) {
489 GtkHelper::Resolve();
490 GtkHelper::gtk_color_chooser_get_rgba(chooser, color);
491 }
492
gtk_color_chooser_set_rgba(GtkColorChooser * chooser,const GdkRGBA * color)493 void gtk_color_chooser_set_rgba(
494 GtkColorChooser *chooser,
495 const GdkRGBA *color) {
496 GtkHelper::Resolve();
497 GtkHelper::gtk_color_chooser_set_rgba(chooser, color);
498 }
499
gtk_color_chooser_set_use_alpha(GtkColorChooser * chooser,gboolean use_alpha)500 void gtk_color_chooser_set_use_alpha(
501 GtkColorChooser *chooser,
502 gboolean use_alpha) {
503 GtkHelper::Resolve();
504 GtkHelper::gtk_color_chooser_set_use_alpha(chooser, use_alpha);
505 }
506
gtk_container_get_type(void)507 GType gtk_container_get_type(void) {
508 GtkHelper::Resolve();
509 return GtkHelper::gtk_container_get_type();
510 }
511
gtk_container_remove(GtkContainer * container,GtkWidget * widget)512 void gtk_container_remove(GtkContainer *container, GtkWidget *widget) {
513 GtkHelper::Resolve();
514 GtkHelper::gtk_container_remove(container, widget);
515 }
516
gtk_dialog_get_type(void)517 GType gtk_dialog_get_type(void) {
518 GtkHelper::Resolve();
519 return GtkHelper::gtk_dialog_get_type();
520 }
521
gtk_dialog_get_widget_for_response(GtkDialog * dialog,gint response_id)522 GtkWidget* gtk_dialog_get_widget_for_response(
523 GtkDialog *dialog,
524 gint response_id) {
525 GtkHelper::Resolve();
526 return GtkHelper::gtk_dialog_get_widget_for_response(
527 dialog,
528 response_id);
529 }
530
gtk_dialog_run(GtkDialog * dialog)531 gint gtk_dialog_run(GtkDialog *dialog) {
532 GtkHelper::Resolve();
533 return GtkHelper::gtk_dialog_run(dialog);
534 }
535
gtk_file_chooser_add_filter(GtkFileChooser * chooser,GtkFileFilter * filter)536 void gtk_file_chooser_add_filter(
537 GtkFileChooser *chooser,
538 GtkFileFilter *filter) {
539 GtkHelper::Resolve();
540 GtkHelper::gtk_file_chooser_add_filter(chooser, filter);
541 }
542
gtk_file_chooser_dialog_new(const gchar * title,GtkWindow * parent,GtkFileChooserAction action,const gchar * first_button_text,...)543 GtkWidget *gtk_file_chooser_dialog_new(
544 const gchar *title,
545 GtkWindow *parent,
546 GtkFileChooserAction action,
547 const gchar *first_button_text,
548 ...) {
549 GtkHelper::Resolve();
550
551 va_list varargs;
552 va_start(varargs, first_button_text);
553
554 const auto result = static_cast<GtkWidget*>(g_object_new(
555 GtkHelper::gtk_file_chooser_dialog_get_type(),
556 "title",
557 title,
558 "action",
559 action,
560 nullptr));
561
562 if (parent) {
563 GtkHelper::gtk_window_set_transient_for(GTK_WINDOW(result), parent);
564 }
565
566 auto button_text = first_button_text;
567 gint response_id;
568 while (button_text) {
569 response_id = va_arg(varargs, gint);
570 GtkHelper::gtk_dialog_add_button(
571 GTK_DIALOG(result),
572 button_text,
573 response_id);
574 button_text = va_arg(varargs, const gchar *);
575 }
576
577 va_end(varargs);
578 return result;
579 }
580
gtk_file_chooser_get_current_folder(GtkFileChooser * chooser)581 gchar *gtk_file_chooser_get_current_folder(GtkFileChooser *chooser) {
582 GtkHelper::Resolve();
583 return GtkHelper::gtk_file_chooser_get_current_folder(chooser);
584 }
585
gtk_file_chooser_get_filename(GtkFileChooser * chooser)586 gchar *gtk_file_chooser_get_filename(GtkFileChooser *chooser) {
587 GtkHelper::Resolve();
588 return GtkHelper::gtk_file_chooser_get_filename(chooser);
589 }
590
gtk_file_chooser_get_filenames(GtkFileChooser * chooser)591 GSList *gtk_file_chooser_get_filenames(GtkFileChooser *chooser) {
592 GtkHelper::Resolve();
593 return GtkHelper::gtk_file_chooser_get_filenames(chooser);
594 }
595
gtk_file_chooser_get_filter(GtkFileChooser * chooser)596 GtkFileFilter *gtk_file_chooser_get_filter(GtkFileChooser *chooser) {
597 GtkHelper::Resolve();
598 return GtkHelper::gtk_file_chooser_get_filter(chooser);
599 }
600
gtk_file_chooser_get_preview_filename(GtkFileChooser * chooser)601 char *gtk_file_chooser_get_preview_filename(GtkFileChooser *chooser) {
602 GtkHelper::Resolve();
603 return GtkHelper::gtk_file_chooser_get_preview_filename(chooser);
604 }
605
gtk_file_chooser_get_type(void)606 GType gtk_file_chooser_get_type(void) {
607 GtkHelper::Resolve();
608 return GtkHelper::gtk_file_chooser_get_type();
609 }
610
gtk_file_chooser_remove_filter(GtkFileChooser * chooser,GtkFileFilter * filter)611 void gtk_file_chooser_remove_filter(
612 GtkFileChooser *chooser,
613 GtkFileFilter *filter) {
614 GtkHelper::Resolve();
615 GtkHelper::gtk_file_chooser_remove_filter(chooser, filter);
616 }
617
gtk_file_chooser_select_filename(GtkFileChooser * chooser,const char * filename)618 gboolean gtk_file_chooser_select_filename(
619 GtkFileChooser *chooser,
620 const char *filename) {
621 GtkHelper::Resolve();
622 return GtkHelper::gtk_file_chooser_select_filename(chooser, filename);
623 }
624
gtk_file_chooser_set_action(GtkFileChooser * chooser,GtkFileChooserAction action)625 void gtk_file_chooser_set_action(
626 GtkFileChooser *chooser,
627 GtkFileChooserAction action) {
628 GtkHelper::Resolve();
629 GtkHelper::gtk_file_chooser_set_action(chooser, action);
630 }
631
gtk_file_chooser_set_create_folders(GtkFileChooser * chooser,gboolean create_folders)632 void gtk_file_chooser_set_create_folders(
633 GtkFileChooser *chooser,
634 gboolean create_folders) {
635 GtkHelper::Resolve();
636 GtkHelper::gtk_file_chooser_set_create_folders(
637 chooser,
638 create_folders);
639 }
640
gtk_file_chooser_set_current_folder(GtkFileChooser * chooser,const gchar * filename)641 gboolean gtk_file_chooser_set_current_folder(
642 GtkFileChooser *chooser,
643 const gchar *filename) {
644 GtkHelper::Resolve();
645 return GtkHelper::gtk_file_chooser_set_current_folder(chooser, filename);
646 }
647
gtk_file_chooser_set_current_name(GtkFileChooser * chooser,const gchar * name)648 void gtk_file_chooser_set_current_name(
649 GtkFileChooser *chooser,
650 const gchar *name) {
651 GtkHelper::Resolve();
652 GtkHelper::gtk_file_chooser_set_current_name(chooser, name);
653 }
654
gtk_file_chooser_set_do_overwrite_confirmation(GtkFileChooser * chooser,gboolean do_overwrite_confirmation)655 void gtk_file_chooser_set_do_overwrite_confirmation(
656 GtkFileChooser *chooser,
657 gboolean do_overwrite_confirmation) {
658 GtkHelper::Resolve();
659 GtkHelper::gtk_file_chooser_set_do_overwrite_confirmation(
660 chooser,
661 do_overwrite_confirmation);
662 }
663
gtk_file_chooser_set_filter(GtkFileChooser * chooser,GtkFileFilter * filter)664 void gtk_file_chooser_set_filter(
665 GtkFileChooser *chooser,
666 GtkFileFilter *filter) {
667 GtkHelper::Resolve();
668 GtkHelper::gtk_file_chooser_set_filter(chooser, filter);
669 }
670
gtk_file_chooser_set_local_only(GtkFileChooser * chooser,gboolean local_only)671 void gtk_file_chooser_set_local_only(
672 GtkFileChooser *chooser,
673 gboolean local_only) {
674 GtkHelper::Resolve();
675 GtkHelper::gtk_file_chooser_set_local_only(chooser, local_only);
676 }
677
gtk_file_chooser_set_preview_widget(GtkFileChooser * chooser,GtkWidget * preview_widget)678 void gtk_file_chooser_set_preview_widget(
679 GtkFileChooser *chooser,
680 GtkWidget *preview_widget) {
681 GtkHelper::Resolve();
682 GtkHelper::gtk_file_chooser_set_preview_widget(chooser, preview_widget);
683 }
684
gtk_file_chooser_set_preview_widget_active(GtkFileChooser * chooser,gboolean active)685 void gtk_file_chooser_set_preview_widget_active(
686 GtkFileChooser *chooser,
687 gboolean active) {
688 GtkHelper::Resolve();
689 GtkHelper::gtk_file_chooser_set_preview_widget_active(chooser, active);
690 }
691
gtk_file_chooser_set_select_multiple(GtkFileChooser * chooser,gboolean select_multiple)692 void gtk_file_chooser_set_select_multiple(
693 GtkFileChooser *chooser,
694 gboolean select_multiple) {
695 GtkHelper::Resolve();
696 GtkHelper::gtk_file_chooser_set_select_multiple(chooser, select_multiple);
697 }
698
gtk_file_filter_add_pattern(GtkFileFilter * filter,const gchar * pattern)699 void gtk_file_filter_add_pattern(
700 GtkFileFilter *filter,
701 const gchar *pattern) {
702 GtkHelper::Resolve();
703 GtkHelper::gtk_file_filter_add_pattern(filter, pattern);
704 }
705
gtk_file_filter_new(void)706 GtkFileFilter *gtk_file_filter_new(void) {
707 GtkHelper::Resolve();
708 return GtkHelper::gtk_file_filter_new();
709 }
710
gtk_file_filter_set_name(GtkFileFilter * filter,const gchar * name)711 void gtk_file_filter_set_name(
712 GtkFileFilter *filter,
713 const gchar *name) {
714 GtkHelper::Resolve();
715 GtkHelper::gtk_file_filter_set_name(filter, name);
716 }
717
gtk_font_chooser_dialog_new(const gchar * title,GtkWindow * parent)718 GtkWidget* gtk_font_chooser_dialog_new(
719 const gchar *title,
720 GtkWindow *parent) {
721 GtkHelper::Resolve();
722 return GtkHelper::gtk_font_chooser_dialog_new(title, parent);
723 }
724
gtk_font_chooser_get_font(GtkFontChooser * fontchooser)725 gchar* gtk_font_chooser_get_font(GtkFontChooser *fontchooser) {
726 GtkHelper::Resolve();
727 return GtkHelper::gtk_font_chooser_get_font(fontchooser);
728 }
729
gtk_font_chooser_get_type(void)730 GType gtk_font_chooser_get_type(void) {
731 GtkHelper::Resolve();
732 return GtkHelper::gtk_font_chooser_get_type();
733 }
734
gtk_font_chooser_set_font(GtkFontChooser * fontchooser,const gchar * fontname)735 void gtk_font_chooser_set_font(
736 GtkFontChooser *fontchooser,
737 const gchar *fontname) {
738 GtkHelper::Resolve();
739 GtkHelper::gtk_font_chooser_set_font(fontchooser, fontname);
740 }
741
gtk_get_current_event_time(void)742 guint32 gtk_get_current_event_time(void) {
743 GtkHelper::Resolve();
744 return GtkHelper::gtk_get_current_event_time();
745 }
746
gtk_image_get_type(void)747 GType gtk_image_get_type(void) {
748 GtkHelper::Resolve();
749 return GtkHelper::gtk_image_get_type();
750 }
751
gtk_image_new(void)752 GtkWidget* gtk_image_new(void) {
753 GtkHelper::Resolve();
754 return GtkHelper::gtk_image_new();
755 }
756
gtk_image_set_from_pixbuf(GtkImage * image,GdkPixbuf * pixbuf)757 void gtk_image_set_from_pixbuf(GtkImage *image, GdkPixbuf *pixbuf) {
758 GtkHelper::Resolve();
759 GtkHelper::gtk_image_set_from_pixbuf(image, pixbuf);
760 }
761
gtk_init(int * argc,char *** argv)762 void gtk_init(int *argc, char ***argv) {
763 GtkHelper::Resolve();
764 GtkHelper::gtk_init(argc, argv);
765 }
766
gtk_menu_get_type(void)767 GType gtk_menu_get_type(void) {
768 GtkHelper::Resolve();
769 return GtkHelper::gtk_menu_get_type();
770 }
771
gtk_menu_item_get_type(void)772 GType gtk_menu_item_get_type(void) {
773 GtkHelper::Resolve();
774 return GtkHelper::gtk_menu_item_get_type();
775 }
776
gtk_menu_item_new(void)777 GtkWidget* gtk_menu_item_new(void) {
778 GtkHelper::Resolve();
779 return GtkHelper::gtk_menu_item_new();
780 }
781
gtk_menu_item_set_label(GtkMenuItem * menu_item,const gchar * label)782 void gtk_menu_item_set_label(GtkMenuItem *menu_item, const gchar *label) {
783 GtkHelper::Resolve();
784 GtkHelper::gtk_menu_item_set_label(menu_item, label);
785 }
786
gtk_menu_item_set_submenu(GtkMenuItem * menu_item,GtkWidget * submenu)787 void gtk_menu_item_set_submenu(GtkMenuItem *menu_item, GtkWidget *submenu) {
788 GtkHelper::Resolve();
789 GtkHelper::gtk_menu_item_set_submenu(menu_item, submenu);
790 }
791
gtk_menu_item_set_use_underline(GtkMenuItem * menu_item,gboolean setting)792 void gtk_menu_item_set_use_underline(
793 GtkMenuItem *menu_item,
794 gboolean setting) {
795 GtkHelper::Resolve();
796 GtkHelper::gtk_menu_item_set_use_underline(menu_item, setting);
797 }
798
gtk_menu_new(void)799 GtkWidget* gtk_menu_new(void) {
800 GtkHelper::Resolve();
801 return GtkHelper::gtk_menu_new();
802 }
803
gtk_menu_popdown(GtkMenu * menu)804 void gtk_menu_popdown(GtkMenu *menu) {
805 GtkHelper::Resolve();
806 GtkHelper::gtk_menu_popdown(menu);
807 }
808
gtk_menu_popup(GtkMenu * menu,GtkWidget * parent_menu_shell,GtkWidget * parent_menu_item,GtkMenuPositionFunc func,gpointer data,guint button,guint32 activate_time)809 void gtk_menu_popup(
810 GtkMenu *menu,
811 GtkWidget *parent_menu_shell,
812 GtkWidget *parent_menu_item,
813 GtkMenuPositionFunc func,
814 gpointer data,
815 guint button,
816 guint32 activate_time) {
817 GtkHelper::Resolve();
818 GtkHelper::gtk_menu_popup(
819 menu,
820 parent_menu_shell,
821 parent_menu_item,
822 func,
823 data,
824 button,
825 activate_time);
826 }
827
gtk_menu_shell_get_type(void)828 GType gtk_menu_shell_get_type(void) {
829 GtkHelper::Resolve();
830 return GtkHelper::gtk_menu_shell_get_type();
831 }
gtk_menu_shell_insert(GtkMenuShell * menu_shell,GtkWidget * child,gint position)832 void gtk_menu_shell_insert(
833 GtkMenuShell *menu_shell,
834 GtkWidget *child,
835 gint position) {
836 GtkHelper::Resolve();
837 GtkHelper::gtk_menu_shell_insert(menu_shell, child, position);
838 }
839
gtk_menu_shell_select_item(GtkMenuShell * menu_shell,GtkWidget * menu_item)840 void gtk_menu_shell_select_item(
841 GtkMenuShell *menu_shell,
842 GtkWidget *menu_item) {
843 GtkHelper::Resolve();
844 GtkHelper::gtk_menu_shell_select_item(menu_shell, menu_item);
845 }
846
gtk_separator_menu_item_new(void)847 GtkWidget* gtk_separator_menu_item_new(void) {
848 GtkHelper::Resolve();
849 return GtkHelper::gtk_separator_menu_item_new();
850 }
851
gtk_settings_get_default(void)852 GtkSettings* gtk_settings_get_default(void) {
853 GtkHelper::Resolve();
854 return GtkHelper::gtk_settings_get_default();
855 }
856
gtk_widget_destroy(GtkWidget * widget)857 void gtk_widget_destroy(GtkWidget *widget) {
858 GtkHelper::Resolve();
859 GtkHelper::gtk_widget_destroy(widget);
860 }
861
gtk_widget_get_scale_factor(GtkWidget * widget)862 gint gtk_widget_get_scale_factor(GtkWidget *widget) {
863 GtkHelper::Resolve();
864 return GtkHelper::gtk_widget_get_scale_factor(widget);
865 }
866
gtk_widget_get_type(void)867 GType gtk_widget_get_type(void) {
868 GtkHelper::Resolve();
869 return GtkHelper::gtk_widget_get_type();
870 }
871
gtk_widget_get_window(GtkWidget * widget)872 GdkWindow *gtk_widget_get_window(GtkWidget *widget) {
873 GtkHelper::Resolve();
874 return GtkHelper::gtk_widget_get_window(widget);
875 }
876
gtk_widget_hide(GtkWidget * widget)877 void gtk_widget_hide(GtkWidget *widget) {
878 GtkHelper::Resolve();
879 GtkHelper::gtk_widget_hide(widget);
880 }
881
gtk_widget_hide_on_delete(GtkWidget * widget)882 gboolean gtk_widget_hide_on_delete(GtkWidget *widget) {
883 GtkHelper::Resolve();
884 return GtkHelper::gtk_widget_hide_on_delete(widget);
885 }
886
gtk_widget_realize(GtkWidget * widget)887 void gtk_widget_realize(GtkWidget *widget) {
888 GtkHelper::Resolve();
889 GtkHelper::gtk_widget_realize(widget);
890 }
891
gtk_widget_set_sensitive(GtkWidget * widget,gboolean sensitive)892 void gtk_widget_set_sensitive(GtkWidget *widget, gboolean sensitive) {
893 GtkHelper::Resolve();
894 GtkHelper::gtk_widget_set_sensitive(widget, sensitive);
895 }
896
gtk_widget_set_visible(GtkWidget * widget,gboolean visible)897 void gtk_widget_set_visible(GtkWidget *widget, gboolean visible) {
898 GtkHelper::Resolve();
899 GtkHelper::gtk_widget_set_visible(widget, visible);
900 }
901
gtk_widget_show(GtkWidget * widget)902 void gtk_widget_show(GtkWidget *widget) {
903 GtkHelper::Resolve();
904 GtkHelper::gtk_widget_show(widget);
905 }
906
gtk_window_get_type(void)907 GType gtk_window_get_type(void) {
908 GtkHelper::Resolve();
909 return GtkHelper::gtk_window_get_type();
910 }
911
gtk_window_set_title(GtkWindow * window,const gchar * title)912 void gtk_window_set_title(GtkWindow *window, const gchar *title) {
913 GtkHelper::Resolve();
914 GtkHelper::gtk_window_set_title(window, title);
915 }
916
pango_font_description_free(PangoFontDescription * desc)917 void pango_font_description_free(PangoFontDescription *desc) {
918 GtkHelper::Resolve();
919 GtkHelper::pango_font_description_free(desc);
920 }
921
pango_font_description_from_string(const char * str)922 PangoFontDescription *pango_font_description_from_string(const char *str) {
923 GtkHelper::Resolve();
924 return GtkHelper::pango_font_description_from_string(str);
925 }
926
pango_font_description_get_family(const PangoFontDescription * desc)927 const char *pango_font_description_get_family(
928 const PangoFontDescription *desc) {
929 GtkHelper::Resolve();
930 return GtkHelper::pango_font_description_get_family(desc);
931 }
932
pango_font_description_get_size(const PangoFontDescription * desc)933 gint pango_font_description_get_size(const PangoFontDescription *desc) {
934 GtkHelper::Resolve();
935 return GtkHelper::pango_font_description_get_size(desc);
936 }
937
pango_font_description_get_style(const PangoFontDescription * desc)938 PangoStyle pango_font_description_get_style(
939 const PangoFontDescription *desc) {
940 GtkHelper::Resolve();
941 return GtkHelper::pango_font_description_get_style(desc);
942 }
943
pango_font_description_get_weight(const PangoFontDescription * desc)944 PangoWeight pango_font_description_get_weight(
945 const PangoFontDescription *desc) {
946 GtkHelper::Resolve();
947 return GtkHelper::pango_font_description_get_weight(desc);
948 }
949
pango_font_description_new(void)950 PangoFontDescription *pango_font_description_new(void) {
951 GtkHelper::Resolve();
952 return GtkHelper::pango_font_description_new();
953 }
954
pango_font_description_set_family(PangoFontDescription * desc,const char * family)955 void pango_font_description_set_family(
956 PangoFontDescription *desc,
957 const char *family) {
958 GtkHelper::Resolve();
959 GtkHelper::pango_font_description_set_family(desc, family);
960 }
961
pango_font_description_set_size(PangoFontDescription * desc,gint size)962 void pango_font_description_set_size(
963 PangoFontDescription *desc,
964 gint size) {
965 GtkHelper::Resolve();
966 GtkHelper::pango_font_description_set_size(desc, size);
967 }
968
pango_font_description_set_style(PangoFontDescription * desc,PangoStyle style)969 void pango_font_description_set_style(
970 PangoFontDescription *desc,
971 PangoStyle style) {
972 GtkHelper::Resolve();
973 GtkHelper::pango_font_description_set_style(desc, style);
974 }
975
pango_font_description_set_weight(PangoFontDescription * desc,PangoWeight weight)976 void pango_font_description_set_weight(
977 PangoFontDescription *desc,
978 PangoWeight weight) {
979 GtkHelper::Resolve();
980 GtkHelper::pango_font_description_set_weight(desc, weight);
981 }
982
pango_font_description_to_string(const PangoFontDescription * desc)983 char *pango_font_description_to_string(const PangoFontDescription *desc) {
984 GtkHelper::Resolve();
985 return GtkHelper::pango_font_description_to_string(desc);
986 }
987
pango_font_face_get_type(void)988 GType pango_font_face_get_type(void) {
989 GtkHelper::Resolve();
990 return GtkHelper::pango_font_face_get_type();
991 }
992
pango_font_family_get_type(void)993 GType pango_font_family_get_type(void) {
994 GtkHelper::Resolve();
995 return GtkHelper::pango_font_family_get_type();
996 }
997