From f7ec4500c417377b467509679011d64a047f17d7 Mon Sep 17 00:00:00 2001 From: TimePath Date: Sun, 23 Jul 2017 17:34:38 +1000 Subject: [PATCH] Wrap GtkGLArea --- CMakeLists.txt | 18 +- cmake/FindGTK2.cmake | 9 + cmake/FindGTK3.cmake | 9 + cmake/FindGtkGLExt.cmake | 3 +- include/igtkgl.h | 25 ++- libs/gtkutil/CMakeLists.txt | 4 +- libs/gtkutil/glwidget.cpp | 391 +++++++++++++++++++--------------- libs/gtkutil/glwidget.h | 20 +- libs/gtkutil/xorrectangle.cpp | 2 +- libs/gtkutil/xorrectangle.h | 4 +- libs/uilib/CMakeLists.txt | 6 +- libs/uilib/uilib.cpp | 12 ++ libs/uilib/uilib.h | 15 ++ radiant/CMakeLists.txt | 2 +- radiant/camwindow.cpp | 8 +- radiant/camwindow.h | 2 +- radiant/texwindow.cpp | 8 +- radiant/xywindow.cpp | 2 +- radiant/xywindow.h | 4 +- 19 files changed, 318 insertions(+), 226 deletions(-) create mode 100644 cmake/FindGTK2.cmake create mode 100644 cmake/FindGTK3.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cbb897b..d3d230ff 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,7 +72,8 @@ if (NOT WIN32) endif () set(CMAKE_POSITION_INDEPENDENT_CODE 1) -set(GTK_NS "GTK2" CACHE STRING "GTK variable prefix") +set(GTK_TARGET 2 CACHE STRING "GTK target") +add_definitions(-DGTK_TARGET=${GTK_TARGET}) #----------------------------------------------------------------------- # Defs @@ -90,13 +91,18 @@ if (NOT CMAKE_BUILD_TYPE MATCHES Release) endif () add_definitions( - -DGTK_DISABLE_SINGLE_INCLUDES - -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES - -DGSEAL_ENABLE - -DGTK_DISABLE_DEPRECATED - -DGDK_DISABLE_DEPRECATED + -DGTK_DISABLE_SINGLE_INCLUDES + -DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES + -DGSEAL_ENABLE ) +if (GTK_TARGET EQUAL 2) + add_definitions( + -DGTK_DISABLE_DEPRECATED + -DGDK_DISABLE_DEPRECATED + ) +endif () + if (APPLE) option(XWINDOWS "Build against X11" ON) add_definitions( diff --git a/cmake/FindGTK2.cmake b/cmake/FindGTK2.cmake new file mode 100644 index 00000000..d3602bf1 --- /dev/null +++ b/cmake/FindGTK2.cmake @@ -0,0 +1,9 @@ +include(FindPkgConfig) +if (PKG_CONFIG_FOUND) + if (GLIB_FIND_REQUIRED) + set(_PACKAGE_ARGS REQUIRED) + else () + set(_PACKAGE_ARGS "") + endif () + pkg_check_modules(GTK2 gtk+-2.0 ${_PACKAGE_ARGS}) +endif () diff --git a/cmake/FindGTK3.cmake b/cmake/FindGTK3.cmake new file mode 100644 index 00000000..96dd46b0 --- /dev/null +++ b/cmake/FindGTK3.cmake @@ -0,0 +1,9 @@ +include(FindPkgConfig) +if (PKG_CONFIG_FOUND) + if (GLIB_FIND_REQUIRED) + set(_PACKAGE_ARGS REQUIRED) + else () + set(_PACKAGE_ARGS "") + endif () + pkg_check_modules(GTK3 gtk+-3.0 ${_PACKAGE_ARGS}) +endif () diff --git a/cmake/FindGtkGLExt.cmake b/cmake/FindGtkGLExt.cmake index 7fb3e9d1..db1a2df8 100644 --- a/cmake/FindGtkGLExt.cmake +++ b/cmake/FindGtkGLExt.cmake @@ -1,11 +1,10 @@ include(FindPkgConfig) if (PKG_CONFIG_FOUND) - if (GtkGLExt_FIND_REQUIRED) + if (GLIB_FIND_REQUIRED) set(_PACKAGE_ARGS REQUIRED) else () set(_PACKAGE_ARGS "") endif () - pkg_check_modules(GTK gtk+-2.0 ${_PACKAGE_ARGS}) if (XWINDOWS) pkg_check_modules(GTKGL gtkglext-x11-1.0 ${_PACKAGE_ARGS}) elseif (WIN32) diff --git a/include/igtkgl.h b/include/igtkgl.h index a78a0570..b4454564 100644 --- a/include/igtkgl.h +++ b/include/igtkgl.h @@ -25,19 +25,18 @@ #include #include "generic/constant.h" -typedef int gint; -typedef gint gboolean; - -struct _QERGtkGLTable -{ - INTEGER_CONSTANT( Version, 1 ); - STRING_CONSTANT( Name, "gtkgl" ); - - ui::Widget ( *glwidget_new )(gboolean zbufffer); - void ( *glwidget_swap_buffers )( ui::Widget widget ); - gboolean ( *glwidget_make_current )( ui::Widget widget ); - void ( *glwidget_destroy_context )( ui::Widget widget ); - void ( *glwidget_create_context )( ui::Widget widget ); +template +using func = T *; + +struct _QERGtkGLTable { + STRING_CONSTANT(Name, "gtkgl"); + INTEGER_CONSTANT(Version, 1); + + func glwidget_new; + func glwidget_swap_buffers; + func glwidget_make_current; + func glwidget_destroy_context; + func glwidget_create_context; }; #endif diff --git a/libs/gtkutil/CMakeLists.txt b/libs/gtkutil/CMakeLists.txt index a0bb6d99..9ccd41b2 100644 --- a/libs/gtkutil/CMakeLists.txt +++ b/libs/gtkutil/CMakeLists.txt @@ -27,8 +27,8 @@ add_library(gtkutil target_include_directories(gtkutil PRIVATE uilib) target_link_libraries(gtkutil PRIVATE uilib) -target_include_directories(gtkutil PRIVATE ${${GTK_NS}_INCLUDE_DIRS}) -target_link_libraries(gtkutil PRIVATE ${${GTK_NS}_LIBRARIES}) +target_include_directories(gtkutil PRIVATE ${GTK${GTK_TARGET}_INCLUDE_DIRS}) +target_link_libraries(gtkutil PRIVATE ${GTK${GTK_TARGET}_LIBRARIES}) find_package(GtkGLExt REQUIRED) target_include_directories(gtkutil PRIVATE ${GTKGL_INCLUDE_DIRS}) diff --git a/libs/gtkutil/glwidget.cpp b/libs/gtkutil/glwidget.cpp index 0e4d75bf..d732a212 100644 --- a/libs/gtkutil/glwidget.cpp +++ b/libs/gtkutil/glwidget.cpp @@ -23,235 +23,282 @@ #include "glwidget.h" -#include "debugging/debugging.h" - #include "igl.h" +void (*GLWidget_sharedContextCreated)() = 0; + +void (*GLWidget_sharedContextDestroyed)() = 0; + +unsigned int g_context_count = 0; + +ui::GLArea g_shared{ui::null}; + +void _glwidget_context_created(ui::GLArea self, void *data) +{ + if (++g_context_count == 1) { + g_shared = self; + g_object_ref(g_shared); + + glwidget_make_current(g_shared); + GlobalOpenGL().contextValid = true; + + GLWidget_sharedContextCreated(); + } +} + +void _glwidget_context_destroyed(ui::GLArea self, void *data) +{ + if (--g_context_count == 0) { + GlobalOpenGL().contextValid = false; + + GLWidget_sharedContextDestroyed(); + + g_shared.unref(); + g_shared = ui::GLArea(ui::null); + } +} + +void glwidget_destroy_context(ui::GLArea self) +{ +} + +void glwidget_create_context(ui::GLArea self) +{ +} + +#if GTK_TARGET == 3 + #include -#include -#include "pointer.h" +GdkGLContext *glwidget_context_created(ui::GLArea self) +{ + _glwidget_context_created(self, nullptr); + return gtk_gl_area_get_context(self); +} + +ui::GLArea glwidget_new(bool zbuffer) +{ + auto self = ui::GLArea(GTK_GL_AREA(gtk_gl_area_new())); + gtk_gl_area_set_has_depth_buffer(self, zbuffer); + gtk_gl_area_set_auto_render(self, false); -void ( *GLWidget_sharedContextCreated )() = 0; -void ( *GLWidget_sharedContextDestroyed )() = 0; + self.connect("realize", G_CALLBACK(glwidget_context_created), nullptr); + return self; +} +bool glwidget_make_current(ui::GLArea self) +{ +// if (!g_context_count) { +// glwidget_context_created(self); +// } + gtk_gl_area_make_current(self); + auto valid = GlobalOpenGL().contextValid; + return true; +} -typedef int* attribs_t; -struct config_t +void glwidget_swap_buffers(ui::GLArea self) { - const char* name; - attribs_t attribs; + gtk_gl_area_queue_render(self); +} + +#endif + +#if GTK_TARGET == 2 + +#include +#include + +#include "pointer.h" + +struct config_t { + const char *name; + int *attribs; }; -typedef const config_t* configs_iterator; +typedef const config_t *configs_iterator; int config_rgba32[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 24, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 24, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 16, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 16, + GDK_GL_ATTRIB_LIST_NONE, }; const config_t configs[] = { - { - "colour-buffer = 32bpp, depth-buffer = none", - config_rgba32, - }, - { - "colour-buffer = 16bpp, depth-buffer = none", - config_rgba, - } + { + "colour-buffer = 32bpp, depth-buffer = none", + config_rgba32, + }, + { + "colour-buffer = 16bpp, depth-buffer = none", + config_rgba, + } }; -GdkGLConfig* glconfig_new(){ - GdkGLConfig* glconfig = 0; - - for ( configs_iterator i = configs, end = configs + 2; i != end; ++i ) - { - glconfig = gdk_gl_config_new( ( *i ).attribs ); - if ( glconfig != 0 ) { - globalOutputStream() << "OpenGL window configuration: " << ( *i ).name << "\n"; - return glconfig; - } - } - - globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = none\n"; - return gdk_gl_config_new_by_mode( (GdkGLConfigMode)( GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE ) ); +GdkGLConfig *glconfig_new() +{ + for (configs_iterator i = configs, end = configs + 2; i != end; ++i) { + if (auto glconfig = gdk_gl_config_new(i->attribs)) { + globalOutputStream() << "OpenGL window configuration: " << i->name << "\n"; + return glconfig; + } + } + globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = none\n"; + return gdk_gl_config_new_by_mode((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE)); } int config_rgba32_depth32[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 24, - GDK_GL_DEPTH_SIZE, 32, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, + 24, + GDK_GL_DEPTH_SIZE, + 32, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba32_depth24[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 24, - GDK_GL_DEPTH_SIZE, 24, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 24, + GDK_GL_DEPTH_SIZE, 24, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba32_depth16[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 24, - GDK_GL_DEPTH_SIZE, 16, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 24, + GDK_GL_DEPTH_SIZE, 16, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba32_depth[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 24, - GDK_GL_DEPTH_SIZE, 1, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 24, + GDK_GL_DEPTH_SIZE, 1, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba_depth16[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 16, - GDK_GL_DEPTH_SIZE, 16, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 16, + GDK_GL_DEPTH_SIZE, 16, + GDK_GL_ATTRIB_LIST_NONE, }; int config_rgba_depth[] = { - GDK_GL_RGBA, - GDK_GL_DOUBLEBUFFER, - GDK_GL_BUFFER_SIZE, 16, - GDK_GL_DEPTH_SIZE, 1, - GDK_GL_ATTRIB_LIST_NONE, + GDK_GL_RGBA, + GDK_GL_DOUBLEBUFFER, + GDK_GL_BUFFER_SIZE, 16, + GDK_GL_DEPTH_SIZE, 1, + GDK_GL_ATTRIB_LIST_NONE, }; const config_t configs_with_depth[] = + { + { + "colour-buffer = 32bpp, depth-buffer = 32bpp", + config_rgba32_depth32, + }, + { + "colour-buffer = 32bpp, depth-buffer = 24bpp", + config_rgba32_depth24, + }, + { + "colour-buffer = 32bpp, depth-buffer = 16bpp", + config_rgba32_depth16, + }, + { + "colour-buffer = 32bpp, depth-buffer = auto", + config_rgba32_depth, + }, + { + "colour-buffer = 16bpp, depth-buffer = 16bpp", + config_rgba_depth16, + }, + { + "colour-buffer = auto, depth-buffer = auto", + config_rgba_depth, + }, + }; + +GdkGLConfig *glconfig_new_with_depth() { - { - "colour-buffer = 32bpp, depth-buffer = 32bpp", - config_rgba32_depth32, - }, - { - "colour-buffer = 32bpp, depth-buffer = 24bpp", - config_rgba32_depth24, - }, - { - "colour-buffer = 32bpp, depth-buffer = 16bpp", - config_rgba32_depth16, - }, - { - "colour-buffer = 32bpp, depth-buffer = auto", - config_rgba32_depth, - }, - { - "colour-buffer = 16bpp, depth-buffer = 16bpp", - config_rgba_depth16, - }, - { - "colour-buffer = auto, depth-buffer = auto", - config_rgba_depth, - }, -}; - -GdkGLConfig* glconfig_new_with_depth(){ - GdkGLConfig* glconfig = 0; - - for ( configs_iterator i = configs_with_depth, end = configs_with_depth + 6; i != end; ++i ) - { - glconfig = gdk_gl_config_new( ( *i ).attribs ); - if ( glconfig != 0 ) { - globalOutputStream() << "OpenGL window configuration: " << ( *i ).name << "\n"; - return glconfig; - } - } - - globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = auto (fallback)\n"; - return gdk_gl_config_new_by_mode( (GdkGLConfigMode)( GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH ) ); + for (configs_iterator i = configs_with_depth, end = configs_with_depth + 6; i != end; ++i) { + if (auto glconfig = gdk_gl_config_new(i->attribs)) { + globalOutputStream() << "OpenGL window configuration: " << i->name << "\n"; + return glconfig; + } + } + globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = auto (fallback)\n"; + return gdk_gl_config_new_by_mode((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH)); } -unsigned int g_context_count = 0; - -namespace +int glwidget_context_created(ui::GLArea self, void *data) { - ui::Widget g_shared; + _glwidget_context_created(self, data); + return false; } -gint glwidget_context_created( ui::Widget widget, gpointer data ){ - if ( ++g_context_count == 1 ) { - g_shared = widget; - g_object_ref( g_shared ); - - glwidget_make_current( g_shared ); - GlobalOpenGL().contextValid = true; - - GLWidget_sharedContextCreated(); - } - return FALSE; -} - -gint glwidget_context_destroyed( ui::Widget widget, gpointer data ){ - if ( --g_context_count == 0 ) { - GlobalOpenGL().contextValid = false; - - GLWidget_sharedContextDestroyed(); - - g_shared.unref(); - g_shared = ui::Widget(nullptr); - } - return FALSE; +int glwidget_context_destroyed(ui::GLArea self, void *data) +{ + _glwidget_context_destroyed(self, data); + return false; } -gboolean glwidget_enable_gl( ui::Widget widget, ui::Widget widget2, gpointer data ){ - if ( !widget2 && !gtk_widget_is_gl_capable( widget ) ) { - GdkGLConfig* glconfig = ( g_object_get_data( G_OBJECT( widget ), "zbuffer" ) ) ? glconfig_new_with_depth() : glconfig_new(); - ASSERT_MESSAGE( glconfig != 0, "failed to create OpenGL config" ); - - gtk_widget_set_gl_capability( widget, glconfig, g_shared ? gtk_widget_get_gl_context( g_shared ) : 0, TRUE, GDK_GL_RGBA_TYPE ); - - gtk_widget_realize( widget ); - if ( !g_shared ) { - g_shared = widget; - } - - // free glconfig? - } - return FALSE; +bool glwidget_enable_gl(ui::GLArea self, ui::Widget root, gpointer data) +{ + if (!root && !gtk_widget_is_gl_capable(self)) { + const auto zbuffer = g_object_get_data(G_OBJECT(self), "zbuffer"); + GdkGLConfig *glconfig = zbuffer ? glconfig_new_with_depth() : glconfig_new(); + ASSERT_MESSAGE(glconfig, "failed to create OpenGL config"); + + const auto share_list = g_shared ? gtk_widget_get_gl_context(g_shared) : nullptr; + gtk_widget_set_gl_capability(self, glconfig, share_list, true, GDK_GL_RGBA_TYPE); + + gtk_widget_realize(self); + if (!g_shared) { + g_shared = self; + } + // free glconfig? + } + return false; } -ui::Widget glwidget_new( gboolean zbuffer ){ - auto widget = ui::Widget(gtk_drawing_area_new()); - - g_object_set_data( G_OBJECT( widget ), "zbuffer", gint_to_pointer( zbuffer ) ); +ui::GLArea glwidget_new(bool zbuffer) +{ + auto self = ui::GLArea(GTK_DRAWING_AREA(gtk_drawing_area_new())); - widget.connect( "hierarchy-changed", G_CALLBACK( glwidget_enable_gl ), 0 ); + g_object_set_data(G_OBJECT(self), "zbuffer", gint_to_pointer(zbuffer)); - widget.connect( "realize", G_CALLBACK( glwidget_context_created ), 0 ); - widget.connect( "unrealize", G_CALLBACK( glwidget_context_destroyed ), 0 ); + self.connect("hierarchy-changed", G_CALLBACK(glwidget_enable_gl), 0); - return widget; -} + self.connect("realize", G_CALLBACK(glwidget_context_created), 0); + self.connect("unrealize", G_CALLBACK(glwidget_context_destroyed), 0); -void glwidget_destroy_context( ui::Widget widget ){ + return self; } -void glwidget_create_context( ui::Widget widget ){ +void glwidget_swap_buffers(ui::GLArea self) +{ + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(self); + gdk_gl_drawable_swap_buffers(gldrawable); } -void glwidget_swap_buffers( ui::Widget widget ){ - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable( widget ); - gdk_gl_drawable_swap_buffers( gldrawable ); +bool glwidget_make_current(ui::GLArea self) +{ + GdkGLContext *glcontext = gtk_widget_get_gl_context(self); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(self); + return gdk_gl_drawable_gl_begin(gldrawable, glcontext); } -gboolean glwidget_make_current( ui::Widget widget ){ - GdkGLContext *glcontext = gtk_widget_get_gl_context( widget ); - GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable( widget ); - return gdk_gl_drawable_gl_begin( gldrawable, glcontext ); -} +#endif diff --git a/libs/gtkutil/glwidget.h b/libs/gtkutil/glwidget.h index 3da07c3d..6a43da88 100644 --- a/libs/gtkutil/glwidget.h +++ b/libs/gtkutil/glwidget.h @@ -24,17 +24,13 @@ #if !defined( INCLUDED_GTKUTIL_GLWIDGET_H ) #define INCLUDED_GTKUTIL_GLWIDGET_H -typedef int gint; -typedef gint gboolean; - -ui::Widget glwidget_new( gboolean zbuffer ); -void glwidget_swap_buffers( ui::Widget widget ); -gboolean glwidget_make_current( ui::Widget widget ); -void glwidget_destroy_context( ui::Widget widget ); -void glwidget_create_context( ui::Widget widget ); - -extern void ( *GLWidget_sharedContextCreated )(); -extern void ( *GLWidget_sharedContextDestroyed )(); - +extern void (*GLWidget_sharedContextCreated)(); +extern void (*GLWidget_sharedContextDestroyed)(); + +ui::GLArea glwidget_new(bool zbuffer); +void glwidget_create_context(ui::GLArea self); +void glwidget_destroy_context(ui::GLArea self); +bool glwidget_make_current(ui::GLArea self); +void glwidget_swap_buffers(ui::GLArea self); #endif diff --git a/libs/gtkutil/xorrectangle.cpp b/libs/gtkutil/xorrectangle.cpp index 364c24e3..d9108b66 100644 --- a/libs/gtkutil/xorrectangle.cpp +++ b/libs/gtkutil/xorrectangle.cpp @@ -28,7 +28,7 @@ void XORRectangle::draw() const cairo_stroke(cr); } -XORRectangle::XORRectangle(ui::Widget widget) : m_widget(widget), cr(0) +XORRectangle::XORRectangle(ui::GLArea widget) : m_widget(widget), cr(0) { } diff --git a/libs/gtkutil/xorrectangle.h b/libs/gtkutil/xorrectangle.h index 8c3ca3cf..2341f1f0 100644 --- a/libs/gtkutil/xorrectangle.h +++ b/libs/gtkutil/xorrectangle.h @@ -64,7 +64,7 @@ class XORRectangle rectangle_t m_rectangle; -ui::Widget m_widget; +ui::GLArea m_widget; cairo_t *cr; bool initialised() const; @@ -72,7 +72,7 @@ void lazy_init(); void draw() const; public: -XORRectangle( ui::Widget widget ); +XORRectangle( ui::GLArea widget ); ~XORRectangle(); void set( rectangle_t rectangle ); }; diff --git a/libs/uilib/CMakeLists.txt b/libs/uilib/CMakeLists.txt index 68e5ee0f..cf300e44 100644 --- a/libs/uilib/CMakeLists.txt +++ b/libs/uilib/CMakeLists.txt @@ -2,9 +2,9 @@ add_library(uilib uilib.cpp ) -find_package(GTK2 REQUIRED) -target_include_directories(uilib PUBLIC ${${GTK_NS}_INCLUDE_DIRS}) -target_link_libraries(uilib PUBLIC ${${GTK_NS}_LIBRARIES}) +find_package(GTK${GTK_TARGET} REQUIRED) +target_include_directories(uilib PUBLIC ${GTK${GTK_TARGET}_INCLUDE_DIRS}) +target_link_libraries(uilib PUBLIC ${GTK${GTK_TARGET}_LIBRARIES}) target_include_directories(uilib PUBLIC gtkutil) target_link_libraries(uilib PUBLIC gtkutil) diff --git a/libs/uilib/uilib.cpp b/libs/uilib/uilib.cpp index 69a46b6d..824af8ce 100644 --- a/libs/uilib/uilib.cpp +++ b/libs/uilib/uilib.cpp @@ -328,4 +328,16 @@ namespace ui { TreePath::TreePath(const char *path) : TreePath(gtk_tree_path_new_from_string(path)) {} + // Custom + + guint IGLArea::on_render(GCallback pFunction, void *data) + { +#if GTK_TARGET == 3 + return this.connect("render", pFunction, data); +#endif +#if GTK_TARGET == 2 + return this.connect("expose_event", pFunction, data); +#endif + }; + } diff --git a/libs/uilib/uilib.h b/libs/uilib/uilib.h index 925384ee..72470990 100644 --- a/libs/uilib/uilib.h +++ b/libs/uilib/uilib.h @@ -64,6 +64,14 @@ struct _GtkWidget; struct _GtkWindow; struct _GTypeInstance; +#if GTK_TARGET == 3 +struct _GtkGLArea; +#endif + +#if GTK_TARGET == 2 +using _GtkGLArea = struct _GtkDrawingArea; +#endif + struct ModalDialog; namespace ui { @@ -530,6 +538,13 @@ namespace ui { , ); + // Custom + + WRAP(GLArea, Widget, _GtkGLArea, (), + , + guint on_render(GCallback pFunction, void *data); + ); + #undef WRAP // callbacks diff --git a/radiant/CMakeLists.txt b/radiant/CMakeLists.txt index 1e2040da..05d79830 100644 --- a/radiant/CMakeLists.txt +++ b/radiant/CMakeLists.txt @@ -100,7 +100,7 @@ target_link_libraries(radiant ${CMAKE_DL_LIBS} ${LIBXML2_LIBRARIES} ${OPENGL_gl_LIBRARY} - ${${GTK_NS}_LIBRARIES} + ${GTK${GTK_TARGET}_LIBRARIES} ${GTKGL_LIBRARIES} includes cmdlib diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 7916f81c..a0c49d22 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -672,7 +672,7 @@ static Shader* m_state_select2; FreezePointer m_freezePointer; public: -ui::Widget m_gl_widget; +ui::GLArea m_gl_widget; ui::Window m_parent{ui::null}; SelectionSystemWindowObserver* m_window_observer; @@ -759,7 +759,7 @@ void GlobalCamera_setCamWnd( CamWnd& camwnd ){ } -ui::Widget CamWnd_getWidget( CamWnd& camwnd ){ +ui::GLArea CamWnd_getWidget( CamWnd& camwnd ){ return camwnd.m_gl_widget; } @@ -1147,7 +1147,7 @@ CamWnd::CamWnd() : m_view( true ), m_Camera( &m_view, CamWndQueueDraw( *this ) ), m_cameraview( m_Camera, &m_view, ReferenceCaller( *this ) ), - m_gl_widget( ui::Widget(glwidget_new( TRUE )) ), + m_gl_widget( glwidget_new( TRUE ) ), m_window_observer( NewWindowObserver() ), m_XORRectangle( m_gl_widget ), m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ), @@ -1171,7 +1171,7 @@ CamWnd::CamWnd() : gtk_widget_set_can_focus( m_gl_widget, true ); m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( camera_size_allocate ), this ); - m_exposeHandler = m_gl_widget.connect( "expose_event", G_CALLBACK( camera_expose ), this ); + m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( camera_expose ), this ); Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) ); diff --git a/radiant/camwindow.h b/radiant/camwindow.h index 312cf66d..d0722a79 100644 --- a/radiant/camwindow.h +++ b/radiant/camwindow.h @@ -34,7 +34,7 @@ void AddCameraMovedCallback( const SignalHandler& handler ); void CamWnd_Update( CamWnd& camwnd ); -ui::Widget CamWnd_getWidget( CamWnd& camwnd ); +ui::GLArea CamWnd_getWidget( CamWnd& camwnd ); void CamWnd_setParent( CamWnd& camwnd, ui::Window parent ); void GlobalCamera_setCamWnd( CamWnd& camwnd ); diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index 6081d14f..4dfee362 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -257,7 +257,7 @@ int m_nTotalHeight; CopiedString shader; ui::Window m_parent{ui::null}; -ui::Widget m_gl_widget; +ui::GLArea m_gl_widget{ui::null}; ui::Widget m_texture_scroll; ui::Widget m_treeViewTree; ui::Widget m_treeViewTags; @@ -1255,7 +1255,7 @@ void Texture_Draw( TextureBrowser& textureBrowser ){ } void TextureBrowser_queueDraw( TextureBrowser& textureBrowser ){ - if ( textureBrowser.m_gl_widget != 0 ) { + if ( textureBrowser.m_gl_widget ) { gtk_widget_queue_draw( textureBrowser.m_gl_widget ); } } @@ -2056,7 +2056,7 @@ ui::Widget TextureBrowser_constructWindow( ui::Window toplevel ){ widget_set_visible( g_TextureBrowser.m_texture_scroll, g_TextureBrowser.m_showTextureScrollbar ); } { // gl_widget - g_TextureBrowser.m_gl_widget = ui::Widget(glwidget_new( FALSE )); + g_TextureBrowser.m_gl_widget = glwidget_new( FALSE ); g_object_ref( g_TextureBrowser.m_gl_widget ); gtk_widget_set_events( g_TextureBrowser.m_gl_widget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK ); @@ -2066,7 +2066,7 @@ ui::Widget TextureBrowser_constructWindow( ui::Window toplevel ){ g_TextureBrowser.m_gl_widget.show(); g_TextureBrowser.m_sizeHandler = g_TextureBrowser.m_gl_widget.connect( "size_allocate", G_CALLBACK( TextureBrowser_size_allocate ), &g_TextureBrowser ); - g_TextureBrowser.m_exposeHandler = g_TextureBrowser.m_gl_widget.connect( "expose_event", G_CALLBACK( TextureBrowser_expose ), &g_TextureBrowser ); + g_TextureBrowser.m_exposeHandler = g_TextureBrowser.m_gl_widget.on_render( G_CALLBACK( TextureBrowser_expose ), &g_TextureBrowser ); g_TextureBrowser.m_gl_widget.connect( "button_press_event", G_CALLBACK( TextureBrowser_button_press ), &g_TextureBrowser ); g_TextureBrowser.m_gl_widget.connect( "button_release_event", G_CALLBACK( TextureBrowser_button_release ), &g_TextureBrowser ); diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index 82501150..80b0a97b 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -834,7 +834,7 @@ XYWnd::XYWnd() : gtk_widget_set_can_focus( m_gl_widget, true ); m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( xywnd_size_allocate ), this ); - m_exposeHandler = m_gl_widget.connect( "expose_event", G_CALLBACK( xywnd_expose ), this ); + m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( xywnd_expose ), this ); m_gl_widget.connect( "button_press_event", G_CALLBACK( xywnd_button_press ), this ); m_gl_widget.connect( "button_release_event", G_CALLBACK( xywnd_button_release ), this ); diff --git a/radiant/xywindow.h b/radiant/xywindow.h index 3eefc11e..cfe8f036 100644 --- a/radiant/xywindow.h +++ b/radiant/xywindow.h @@ -63,7 +63,7 @@ inline const char* ViewType_getTitle( VIEWTYPE viewtype ){ class XYWnd { -ui::Widget m_gl_widget; +ui::GLArea m_gl_widget; guint m_sizeHandler; guint m_exposeHandler; @@ -77,7 +77,7 @@ XYWnd(); void queueDraw(){ m_deferredDraw.draw(); } -ui::Widget GetWidget(){ +ui::GLArea GetWidget(){ return m_gl_widget; } -- 2.39.2