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