Branch: refs/heads/master Author: Colomban Wendling ban@herbesfolles.org Committer: Colomban Wendling ban@herbesfolles.org Date: Sat, 29 Oct 2016 14:09:04 UTC Commit: 65710c526a5c605705cbaf8c333ea86d898f5845 https://github.com/geany/geany/commit/65710c526a5c605705cbaf8c333ea86d898f58...
Log Message: ----------- VTE: Add support for 2.91 GdkRGBA API variant
The 2.91 API switched from GdkColor to GdkRGBA, but kept the same function names, so we need to detect this version and wrap the affected API to convert our GdkColors to GdkRGBAs.
Modified Paths: -------------- src/vte.c
Modified: src/vte.c 88 lines changed, 81 insertions(+), 7 deletions(-) =================================================================== @@ -98,6 +98,8 @@ typedef enum { /* Holds function pointers we need to access the VTE API. */ struct VteFunctions { + guint (*vte_get_major_version) (void); + guint (*vte_get_minor_version) (void); GtkWidget* (*vte_terminal_new) (void); pid_t (*vte_terminal_fork_command) (VteTerminal *terminal, const char *command, char **argv, char **envv, const char *directory, gboolean lastlog, @@ -132,6 +134,12 @@ struct VteFunctions void (*vte_terminal_set_audible_bell) (VteTerminal *terminal, gboolean is_audible); void (*vte_terminal_set_background_image_file) (VteTerminal *terminal, const char *path); GtkAdjustment* (*vte_terminal_get_adjustment) (VteTerminal *terminal); +#if GTK_CHECK_VERSION(3, 0, 0) + /* hack for the VTE 2.91 API using GdkRGBA: we wrap the API to keep using GdkColor on our side */ + void (*vte_terminal_set_color_foreground_rgba) (VteTerminal *terminal, const GdkRGBA *foreground); + void (*vte_terminal_set_color_bold_rgba) (VteTerminal *terminal, const GdkRGBA *foreground); + void (*vte_terminal_set_color_background_rgba) (VteTerminal *terminal, const GdkRGBA *background); +#endif };
@@ -186,6 +194,33 @@ static GtkAdjustment *default_vte_terminal_get_adjustment(VteTerminal *vte) }
+#if GTK_CHECK_VERSION(3, 0, 0) +/* Wrap VTE 2.91 API using GdkRGBA with GdkColor so we use a single API on our side */ + +static void rgba_from_color(GdkRGBA *rgba, const GdkColor *color) +{ + rgba->red = color->red / 65535.0; + rgba->green = color->green / 65535.0; + rgba->blue = color->blue / 65535.0; + rgba->alpha = 1.0; +} + +# define WRAP_RGBA_SETTER(name) \ + static void wrap_##name(VteTerminal *terminal, const GdkColor *color) \ + { \ + GdkRGBA rgba; \ + rgba_from_color(&rgba, color); \ + vf->name##_rgba(terminal, &rgba); \ + } + +WRAP_RGBA_SETTER(vte_terminal_set_color_background) +WRAP_RGBA_SETTER(vte_terminal_set_color_bold) +WRAP_RGBA_SETTER(vte_terminal_set_color_foreground) + +# undef WRAP_RGBA_SETTER +#endif + + static gchar **vte_get_child_environment(void) { const gchar *exclude_vars[] = {"COLUMNS", "LINES", "TERM", "TERM_PROGRAM", NULL}; @@ -515,20 +550,45 @@ static void vte_set_cursor_blink_mode(void) }
+#if GTK_CHECK_VERSION(3, 0, 0) +static gboolean vte_is_2_91(void) +{ + guint major = vf->vte_get_major_version ? vf->vte_get_major_version() : 0; + guint minor = vf->vte_get_minor_version ? vf->vte_get_minor_version() : 0; + + /* 2.91 API started at 0.38 */ + return ((major > 0 || (major == 0 && minor >= 38)) || + /* 0.38 doesn't have runtime version checks, so check a symbol that didn't exist before */ + vf->vte_terminal_spawn_sync != NULL); +} +#endif + + static gboolean vte_register_symbols(GModule *mod) { + #define BIND_SYMBOL_FULL(name, dest) \ + g_module_symbol(mod, name, (void*)(dest)) #define BIND_SYMBOL(field) \ - g_module_symbol(mod, #field, (void*)&vf->field) - #define BIND_REQUIRED_SYMBOL(field) \ + BIND_SYMBOL_FULL(#field, &vf->field) + #define BIND_REQUIRED_SYMBOL_FULL(name, dest) \ G_STMT_START { \ - if (! BIND_SYMBOL(field)) \ + if (! BIND_SYMBOL_FULL(name, dest)) \ { \ g_critical(_("invalid VTE library "%s": missing symbol "%s""), \ - g_module_name(mod), #field); \ + g_module_name(mod), name); \ return FALSE; \ } \ } G_STMT_END + #define BIND_REQUIRED_SYMBOL(field) \ + BIND_REQUIRED_SYMBOL_FULL(#field, &vf->field) + #define BIND_REQUIRED_SYMBOL_RGBA_WRAPPED(field) \ + G_STMT_START { \ + BIND_REQUIRED_SYMBOL_FULL(#field, &vf->field##_rgba); \ + vf->field = wrap_##field; \ + } G_STMT_END
+ BIND_SYMBOL(vte_get_major_version); + BIND_SYMBOL(vte_get_minor_version); BIND_REQUIRED_SYMBOL(vte_terminal_new); BIND_REQUIRED_SYMBOL(vte_terminal_set_size); if (! BIND_SYMBOL(vte_terminal_spawn_sync)) @@ -548,9 +608,20 @@ static gboolean vte_register_symbols(GModule *mod) BIND_REQUIRED_SYMBOL(vte_terminal_get_has_selection); BIND_REQUIRED_SYMBOL(vte_terminal_copy_clipboard); BIND_REQUIRED_SYMBOL(vte_terminal_paste_clipboard); - BIND_REQUIRED_SYMBOL(vte_terminal_set_color_foreground); - BIND_REQUIRED_SYMBOL(vte_terminal_set_color_bold); - BIND_REQUIRED_SYMBOL(vte_terminal_set_color_background); +#if GTK_CHECK_VERSION(3, 0, 0) + if (vte_is_2_91()) + { + BIND_REQUIRED_SYMBOL_RGBA_WRAPPED(vte_terminal_set_color_foreground); + BIND_REQUIRED_SYMBOL_RGBA_WRAPPED(vte_terminal_set_color_bold); + BIND_REQUIRED_SYMBOL_RGBA_WRAPPED(vte_terminal_set_color_background); + } + else +#endif + { + BIND_REQUIRED_SYMBOL(vte_terminal_set_color_foreground); + BIND_REQUIRED_SYMBOL(vte_terminal_set_color_bold); + BIND_REQUIRED_SYMBOL(vte_terminal_set_color_background); + } BIND_REQUIRED_SYMBOL(vte_terminal_set_background_image_file); BIND_REQUIRED_SYMBOL(vte_terminal_feed_child); BIND_REQUIRED_SYMBOL(vte_terminal_im_append_menuitems); @@ -564,8 +635,11 @@ static gboolean vte_register_symbols(GModule *mod) /* vte_terminal_get_adjustment() is available since 0.9 and removed in 0.38 */ vf->vte_terminal_get_adjustment = default_vte_terminal_get_adjustment;
+ #undef BIND_REQUIRED_SYMBOL_RGBA_WRAPPED #undef BIND_REQUIRED_SYMBOL + #undef BIND_REQUIRED_SYMBOL_FULL #undef BIND_SYMBOL + #undef BIND_SYMBOL_FULL
return TRUE; }
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).