diff -r e199adc2d3cc modules/graphics/src/main/native-glass/gtk/glass_gtkcompat.cpp --- a/modules/graphics/src/main/native-glass/gtk/glass_gtkcompat.cpp Fri Oct 02 08:25:28 2015 -0700 +++ b/modules/graphics/src/main/native-glass/gtk/glass_gtkcompat.cpp Sat Dec 22 00:33:14 2018 +0900 @@ -26,6 +26,7 @@ #include "glass_general.h" #include #include +#include gboolean disableGrab = FALSE; @@ -292,12 +293,41 @@ gtk_widget_realize(window); } +static GdkColormap* known_colormap = 0; +static GdkVisual* known_visual = 0; +static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; + void glass_gtk_window_configure_from_visual(GtkWidget *widget, GdkVisual *visual) { - GdkColormap *colormap = gdk_colormap_new(visual, TRUE); + GdkColormap *colormap; + pthread_mutex_lock(&mtx); + if (known_visual == 0 || known_colormap == 0) { + colormap = gdk_colormap_new(visual, TRUE); + known_colormap = colormap; + known_visual = visual; + } else if (visual != known_visual) { + g_object_unref(known_colormap); + colormap = gdk_colormap_new(visual, TRUE); + known_visual = visual; + known_colormap = colormap; + } else { + colormap = known_colormap; + } + pthread_mutex_unlock(&mtx); gtk_widget_set_colormap(widget, colormap); } +#ifdef __GNUC__ +__attribute__((destructor)) +static void destructor() { + if (known_colormap) { + g_object_unref(known_colormap); + } +} +#endif + static gboolean configure_transparent_window(GtkWidget *window) { GdkScreen *default_screen = gdk_screen_get_default();