#include "config.h"
#include "GLContext.h"
#include "GLContextGLX.h"
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
namespace WebCore {
typedef HashMap<GtkWidget*, OwnPtr<GLContext> > WindowContextMap;
static WindowContextMap& windowContextsMap()
{
DEFINE_STATIC_LOCAL(WindowContextMap, windowContexts, ());
return windowContexts;
}
static void shutdownGLContext(GtkWidget* widget, void*)
{
WindowContextMap& windowContexts = windowContextsMap();
WindowContextMap::iterator i = windowContexts.find(widget);
if (i != windowContexts.end())
windowContexts.remove(i);
}
GLContext* GLContext::getContextForWidget(GtkWidget* widget)
{
ASSERT(widget);
WindowContextMap& windowContexts = windowContextsMap();
WindowContextMap::iterator i = windowContextsMap().find(widget);
if (i != windowContexts.end())
return i->second.get();
if (!g_signal_handler_find(widget, G_SIGNAL_MATCH_FUNC, 0, 0, 0, reinterpret_cast<void*>(shutdownGLContext), 0))
g_signal_connect(widget, "unmap", G_CALLBACK(shutdownGLContext), 0);
GLContext* context = 0;
#if USE(GLX)
GdkWindow* gdkWindow = gtk_widget_get_window(widget);
context = gdkWindow && gdk_window_has_native(gdkWindow) ? GLContextGLX::createContext(GDK_WINDOW_XID(gdkWindow)) : GLContextGLX::createContext(0);
#endif
if (!context)
return 0;
windowContexts.set(widget, adoptPtr(context));
return context;
}
}