aboutsummaryrefslogtreecommitdiff
path: root/src/libui_sdl/libui/unix/future.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libui_sdl/libui/unix/future.c')
-rw-r--r--src/libui_sdl/libui/unix/future.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/libui_sdl/libui/unix/future.c b/src/libui_sdl/libui/unix/future.c
new file mode 100644
index 0000000..1f9f532
--- /dev/null
+++ b/src/libui_sdl/libui/unix/future.c
@@ -0,0 +1,42 @@
+// 29 june 2016
+#include "uipriv_unix.h"
+
+// functions FROM THE FUTURE!
+// in some cases, because being held back by LTS releases sucks :/
+// in others, because parts of GTK+ being unstable until recently also sucks :/
+
+// added in pango 1.38; we need 1.36
+static PangoAttribute *(*newFGAlphaAttr)(guint16 alpha) = NULL;
+
+// added in GTK+ 3.20; we need 3.10
+static void (*gwpIterSetObjectName)(GtkWidgetPath *path, gint pos, const char *name) = NULL;
+
+// note that we treat any error as "the symbols aren't there" (and don't care if dlclose() failed)
+void loadFutures(void)
+{
+ void *handle;
+
+ // dlsym() walks the dependency chain, so opening the current process should be sufficient
+ handle = dlopen(NULL, RTLD_LAZY);
+ if (handle == NULL)
+ return;
+#define GET(var, fn) *((void **) (&var)) = dlsym(handle, #fn)
+ GET(newFGAlphaAttr, pango_attr_foreground_alpha_new);
+ GET(gwpIterSetObjectName, gtk_widget_path_iter_set_object_name);
+ dlclose(handle);
+}
+
+PangoAttribute *FUTURE_pango_attr_foreground_alpha_new(guint16 alpha)
+{
+ if (newFGAlphaAttr == NULL)
+ return NULL;
+ return (*newFGAlphaAttr)(alpha);
+}
+
+gboolean FUTURE_gtk_widget_path_iter_set_object_name(GtkWidgetPath *path, gint pos, const char *name)
+{
+ if (gwpIterSetObjectName == NULL)
+ return FALSE;
+ (*gwpIterSetObjectName)(path, pos, name);
+ return TRUE;
+}