]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/xywindow.cpp
Implement buffer operations
[xonotic/netradiant.git] / radiant / xywindow.cpp
index 3e2b1fd381b11a3fa42d70fc79a62e86f10081e7..4f1d4082f08dfe74ad3be661a18fd395fbd9fdb9 100644 (file)
@@ -27,6 +27,8 @@
 
 #include "xywindow.h"
 
+#include <gtk/gtk.h>
+
 #include "debugging/debugging.h"
 
 #include "ientity.h"
@@ -39,9 +41,9 @@
 #include "image.h"
 #include "gtkutil/messagebox.h"
 
-#include <gtk/gtk.h>
 #include <uilib/uilib.h>
 #include <gdk/gdkkeysyms.h>
+#include <util/buffer.h>
 
 #include "generic/callback.h"
 #include "string/string.h"
@@ -411,6 +413,7 @@ inline unsigned int buttons_for_button_and_modifiers( ButtonIdentifier button, M
 
        switch ( button.get() )
        {
+    case ButtonEnumeration::INVALID: break;
        case ButtonEnumeration::LEFT: buttons |= RAD_LBUTTON; break;
        case ButtonEnumeration::MIDDLE: buttons |= RAD_MBUTTON; break;
        case ButtonEnumeration::RIGHT: buttons |= RAD_RBUTTON; break;
@@ -537,7 +540,7 @@ VIEWTYPE GlobalXYWnd_getCurrentViewType(){
 
 bool g_bCrossHairs = false;
 
-GtkMenu* XYWnd::m_mnuDrop = 0;
+ui::Menu XYWnd::m_mnuDrop(ui::null);
 
 // this is disabled, and broken
 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
@@ -706,7 +709,7 @@ bool XYWnd::chaseMouseMotion( int pointx, int pointy ){
 Shader* XYWnd::m_state_selected = 0;
 
 void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
-       if ( gtk_widget_get_visible( self.GetWidget() ) ) {
+       if ( self.GetWidget().visible() ) {
                self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.Width(), self.Height() ) );
        }
 }
@@ -788,7 +791,7 @@ void XYWnd_CameraMoved( XYWnd& xywnd ){
 
 XYWnd::XYWnd() :
        m_gl_widget( glwidget_new( FALSE ) ),
-       m_deferredDraw( WidgetQueueDrawCaller( *m_gl_widget ) ),
+       m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ),
        m_deferred_motion( xywnd_motion, this ),
        m_parent( 0 ),
        m_window_observer( NewWindowObserver() ),
@@ -819,7 +822,7 @@ XYWnd::XYWnd() :
 
        m_entityCreate = false;
 
-       m_mnuDrop = 0;
+       m_mnuDrop = ui::Menu(ui::null);
 
        GlobalWindowObservers_add( m_window_observer );
        GlobalWindowObservers_connectWidget( m_gl_widget );
@@ -827,20 +830,20 @@ XYWnd::XYWnd() :
        m_window_observer->setRectangleDrawCallback( ReferenceCaller1<XYWnd, rect_t, xy_update_xor_rectangle>( *this ) );
        m_window_observer->setView( m_view );
 
-       g_object_ref( m_gl_widget );
+       g_object_ref( m_gl_widget._handle );
 
        gtk_widget_set_events( m_gl_widget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK );
        gtk_widget_set_can_focus( m_gl_widget, true );
 
-       m_sizeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "size_allocate", G_CALLBACK( xywnd_size_allocate ), this );
-       m_exposeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "expose_event", G_CALLBACK( xywnd_expose ), this );
+       m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( xywnd_size_allocate ), this );
+       m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( xywnd_expose ), this );
 
-       g_signal_connect( G_OBJECT( m_gl_widget ), "button_press_event", G_CALLBACK( xywnd_button_press ), this );
-       g_signal_connect( G_OBJECT( m_gl_widget ), "button_release_event", G_CALLBACK( xywnd_button_release ), this );
-       g_signal_connect( G_OBJECT( m_gl_widget ), "focus_in_event", G_CALLBACK( xywnd_focus_in ), this );
-       g_signal_connect( G_OBJECT( m_gl_widget ), "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion );
+       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 );
+       m_gl_widget.connect( "focus_in_event", G_CALLBACK( xywnd_focus_in ), this );
+       m_gl_widget.connect( "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion );
 
-       g_signal_connect( G_OBJECT( m_gl_widget ), "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this );
+       m_gl_widget.connect( "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this );
 
        Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) );
 
@@ -858,15 +861,15 @@ XYWnd::XYWnd() :
 XYWnd::~XYWnd(){
        onDestroyed();
 
-       if ( m_mnuDrop != 0 ) {
+       if ( m_mnuDrop ) {
                gtk_widget_destroy( GTK_WIDGET( m_mnuDrop ) );
-               m_mnuDrop = 0;
+               m_mnuDrop = ui::Menu(ui::null);
        }
 
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_sizeHandler );
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_exposeHandler );
 
-       g_object_unref( m_gl_widget );
+       m_gl_widget.unref();
 
        m_window_observer->release();
 }
@@ -1075,21 +1078,21 @@ void entitycreate_activated( ui::Widget item ){
        }
 }
 
-void EntityClassMenu_addItem( GtkMenu* menu, const char* name ){
-       GtkMenuItem* item = ui::MenuItem( name );
-       g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( entitycreate_activated ), item );
-       gtk_widget_show( GTK_WIDGET( item ) );
+void EntityClassMenu_addItem( ui::Menu menu, const char* name ){
+       auto item = ui::MenuItem( name );
+       item.connect( "activate", G_CALLBACK( entitycreate_activated ), item );
+       item.show();
        menu_add_item( menu, item );
 }
 
 class EntityClassMenuInserter : public EntityClassVisitor
 {
-typedef std::pair<GtkMenu*, CopiedString> MenuPair;
+typedef std::pair<ui::Menu, CopiedString> MenuPair;
 typedef std::vector<MenuPair> MenuStack;
 MenuStack m_stack;
 CopiedString m_previous;
 public:
-EntityClassMenuInserter( GtkMenu* menu ){
+EntityClassMenuInserter( ui::Menu menu ){
        m_stack.reserve( 2 );
        m_stack.push_back( MenuPair( menu, "" ) );
 }
@@ -1106,11 +1109,11 @@ void visit( EntityClass* e ){
        m_previous = e->name();
 }
 void pushMenu( const CopiedString& name ){
-       GtkMenuItem* item = ui::MenuItem( name.c_str() );
-       gtk_widget_show( GTK_WIDGET( item ) );
-       container_add_widget( GTK_CONTAINER( m_stack.back().first ), GTK_WIDGET( item ) );
+       auto item = ui::MenuItem( name.c_str() );
+       item.show();
+       m_stack.back().first.add(item);
 
-       GtkMenu* submenu = ui::Menu();
+       auto submenu = ui::Menu(ui::New);
        gtk_menu_item_set_submenu( item, GTK_WIDGET( submenu ) );
 
        m_stack.push_back( MenuPair( submenu, name ) );
@@ -1152,8 +1155,8 @@ void XYWnd::OnContextMenu(){
                return;
        }
 
-       if ( m_mnuDrop == 0 ) { // first time, load it up
-               GtkMenu* menu = m_mnuDrop = ui::Menu();
+       if ( !m_mnuDrop ) { // first time, load it up
+               auto menu = m_mnuDrop = ui::Menu(ui::New);
 
                EntityClassMenuInserter inserter( menu );
                GlobalEntityClassManager().forEach( inserter );
@@ -1184,7 +1187,7 @@ void XYWnd::Move_Begin(){
        }
        m_move_started = true;
        g_xywnd_freezePointer.freeze_pointer( m_parent  ? m_parent : MainFrame_getWindow(), XYWnd_moveDelta, this );
-       m_move_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this );
+       m_move_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this );
 }
 
 void XYWnd::Move_End(){
@@ -1230,7 +1233,7 @@ void XYWnd::Zoom_Begin(){
        m_zoom_started = true;
        g_dragZoom = 0;
        g_xywnd_freezePointer.freeze_pointer( m_parent ? m_parent : MainFrame_getWindow(), XYWnd_zoomDelta, this );
-       m_zoom_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this );
+       m_zoom_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this );
 }
 
 void XYWnd::Zoom_End(){
@@ -1435,10 +1438,10 @@ void XYWnd::XY_LoadBackgroundImage( const char *name ){
                globalOutputStream() << "WARNING: could not extract the relative path, using full path instead\n";
        }
 
-       char fileNameWithoutExt[512];
-       strncpy( fileNameWithoutExt, relative, sizeof( fileNameWithoutExt ) - 1 );
-       fileNameWithoutExt[512 - 1] = '\0';
-       fileNameWithoutExt[strlen( fileNameWithoutExt ) - 4] = '\0';
+       auto fileNameWithoutExt = u::buffer<512>();
+       fileNameWithoutExt.copy(relative);
+       fileNameWithoutExt.terminate();
+       fileNameWithoutExt.mut()[fileNameWithoutExt.strlen() - 4] = '\0';
 
        Image *image = QERApp_LoadImage( 0, fileNameWithoutExt );
        if ( !image ) {
@@ -1594,7 +1597,7 @@ void XYWnd::XY_DrawBackground( void ){
 void XYWnd::XY_DrawGrid( void ) {
        float x, y, xb, xe, yb, ye;
        float w, h, a;
-       char text[32];
+       auto text = u::buffer<32>();
        float step, minor_step, stepx, stepy;
        step = minor_step = stepx = stepy = GetGridSize();
 
@@ -1715,12 +1718,12 @@ void XYWnd::XY_DrawGrid( void ) {
                float offy = m_vOrigin[nDim1] - w +  4                                            / m_fScale;
                for ( x = xb - fmod( xb, stepx ); x <= xe ; x += stepx ) {
                        glRasterPos2f( x, offx );
-                       sprintf( text, "%g", x );
+                       text.sprintf( "%g", x );
                        GlobalOpenGL().drawString( text );
                }
                for ( y = yb - fmod( yb, stepy ); y <= ye ; y += stepy ) {
                        glRasterPos2f( offy, y );
-                       sprintf( text, "%g", y );
+                       text.sprintf( "%g", y );
                        GlobalOpenGL().drawString( text );
                }
 
@@ -1776,7 +1779,7 @@ void XYWnd::XY_DrawBlockGrid(){
 
        float x, y, xb, xe, yb, ye;
        float w, h;
-       char text[32];
+       auto text = u::buffer<32>();
 
        glDisable( GL_TEXTURE_2D );
        glDisable( GL_TEXTURE_1D );
@@ -1844,7 +1847,7 @@ void XYWnd::XY_DrawBlockGrid(){
                        for ( y = yb ; y < ye ; y += g_xywindow_globals_private.blockSize )
                        {
                                glRasterPos2f( x + ( g_xywindow_globals_private.blockSize / 2 ), y + ( g_xywindow_globals_private.blockSize / 2 ) );
-                               sprintf( text, "%i,%i",(int)floor( x / g_xywindow_globals_private.blockSize ), (int)floor( y / g_xywindow_globals_private.blockSize ) );
+                text.sprintf( "%i,%i",(int)floor( x / g_xywindow_globals_private.blockSize ), (int)floor( y / g_xywindow_globals_private.blockSize ) );
                                GlobalOpenGL().drawString( text );
                        }
        }
@@ -2065,7 +2068,7 @@ void SetState( Shader* state, EStyle style ){
                m_state_stack.back().m_state = state;
        }
 }
-const EStyle getStyle() const {
+EStyle getStyle() const {
        return eWireframeOnly;
 }
 void PushState(){
@@ -2539,19 +2542,19 @@ void ToggleShowGrid(){
 ToggleShown g_xy_top_shown( true );
 
 void XY_Top_Shown_Construct( ui::Window parent ){
-       g_xy_top_shown.connect( GTK_WIDGET( parent ) );
+       g_xy_top_shown.connect( parent );
 }
 
 ToggleShown g_yz_side_shown( false );
 
 void YZ_Side_Shown_Construct( ui::Window parent ){
-       g_yz_side_shown.connect( GTK_WIDGET( parent ) );
+       g_yz_side_shown.connect( parent );
 }
 
 ToggleShown g_xz_front_shown( false );
 
 void XZ_Front_Shown_Construct( ui::Window parent ){
-       g_xz_front_shown.connect( GTK_WIDGET( parent ) );
+       g_xz_front_shown.connect( parent );
 }
 
 
@@ -2567,9 +2570,9 @@ void realise(){
 }
 void unrealise(){
        if ( ++m_unrealised == 1 ) {
-               if ( XYWnd::m_mnuDrop != 0 ) {
+               if ( XYWnd::m_mnuDrop ) {
                        gtk_widget_destroy( GTK_WIDGET( XYWnd::m_mnuDrop ) );
-                       XYWnd::m_mnuDrop = 0;
+                       XYWnd::m_mnuDrop = ui::Menu(ui::null);
                }
        }
 }