]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/bobtoolz/dialogs/dialogs-gtk.cpp
Merge commit 'bf6dd1f2d186c799adf11f1e744a1ff57aa8d335' into garux-merge
[xonotic/netradiant.git] / contrib / bobtoolz / dialogs / dialogs-gtk.cpp
index 954747bc42b50c13708179d05afec7d7451c5d82..9329f306a2817e7823d6e95fb456ee9e310861b3 100644 (file)
    ---------------------------------*/
 
 typedef struct {
-       GtkWidget *cbTexChange;
-       GtkWidget *editTexOld, *editTexNew;
+       ui::Widget cbTexChange{ui::null};
+       ui::Widget editTexOld{ui::null}, editTexNew{ui::null};
 
-       GtkWidget *cbScaleHor, *cbScaleVert;
-       GtkWidget *editScaleHor, *editScaleVert;
+       ui::Widget cbScaleHor{ui::null}, cbScaleVert{ui::null};
+       ui::Widget editScaleHor{ui::null}, editScaleVert{ui::null};
 
-       GtkWidget *cbShiftHor, *cbShiftVert;
-       GtkWidget *editShiftHor, *editShiftVert;
+       ui::Widget cbShiftHor{ui::null}, cbShiftVert{ui::null};
+       ui::Widget editShiftHor{ui::null}, editShiftVert{ui::null};
 
-       GtkWidget *cbRotation;
-       GtkWidget *editRotation;
+       ui::Widget cbRotation{ui::null};
+       ui::Widget editRotation{ui::null};
 }dlg_texReset_t;
 
 dlg_texReset_t dlgTexReset;
 
 void Update_TextureReseter();
 
-static void dialog_button_callback_texreset_update( GtkWidget *widget, gpointer data ){
+static void dialog_button_callback_texreset_update(ui::Widget widget, gpointer data ){
        Update_TextureReseter();
 }
 
@@ -78,12 +78,11 @@ void Update_TextureReseter(){
        gtk_editable_set_editable( GTK_EDITABLE( dlgTexReset.editRotation ), check );
 }
 
-static void dialog_button_callback( GtkWidget *widget, gpointer data ){
-       GtkWidget *parent;
+static void dialog_button_callback( ui::Widget widget, gpointer data ){
        int *loop;
        EMessageBoxReturn *ret;
 
-       parent = gtk_widget_get_toplevel( widget );
+       auto parent = widget.window();
        loop = (int*)g_object_get_data( G_OBJECT( parent ), "loop" );
        ret = (EMessageBoxReturn*)g_object_get_data( G_OBJECT( parent ), "ret" );
 
@@ -91,21 +90,18 @@ static void dialog_button_callback( GtkWidget *widget, gpointer data ){
        *ret = (EMessageBoxReturn)gpointer_to_int( data );
 }
 
-static gint dialog_delete_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
-       int *loop;
-
-       gtk_widget_hide( widget );
-       loop = (int*)g_object_get_data( G_OBJECT( widget ), "loop" );
+static gint dialog_delete_callback( ui::Widget widget, GdkEvent* event, gpointer data ){
+       widget.hide();
+       int *loop = (int *) g_object_get_data(G_OBJECT(widget), "loop");
        *loop = 0;
-
        return TRUE;
 }
 
-static void dialog_button_callback_settex( GtkWidget *widget, gpointer data ){
+static void dialog_button_callback_settex(ui::Widget widget, gpointer data ){
        TwinWidget* tw = (TwinWidget*)data;
 
-       GtkEntry* entry = GTK_ENTRY( tw->one );
-       auto* combo = GTK_BIN(tw->two);
+    auto entry = ui::Entry::from( tw->one );
+       auto combo = tw->two;
 
        const gchar *tex = gtk_entry_get_text(GTK_ENTRY (gtk_bin_get_child(combo)));
        gtk_entry_set_text( entry, tex );
@@ -115,7 +111,7 @@ static void dialog_button_callback_settex( GtkWidget *widget, gpointer data ){
     Data validation Routines
    ---------------------------------*/
 
-bool ValidateTextFloat( const char* pData, char* error_title, float* value ){
+bool ValidateTextFloat( const char* pData, const char* error_title, float* value ){
        if ( pData ) {
                float testNum = (float)atof( pData );
 
@@ -134,7 +130,7 @@ bool ValidateTextFloat( const char* pData, char* error_title, float* value ){
        return FALSE;
 }
 
-bool ValidateTextFloatRange( const char* pData, float min, float max, char* error_title, float* value ){
+bool ValidateTextFloatRange( const char* pData, float min, float max, const char* error_title, float* value ){
        char error_buffer[256];
        sprintf( error_buffer, "Please Enter A Floating Point Number Between %.3f and %.3f", min, max );
 
@@ -156,7 +152,7 @@ bool ValidateTextFloatRange( const char* pData, float min, float max, char* erro
        return FALSE;
 }
 
-bool ValidateTextIntRange( const char* pData, int min, int max, char* error_title, int* value ){
+bool ValidateTextIntRange( const char* pData, int min, int max, const char* error_title, int* value ){
        char error_buffer[256];
        sprintf( error_buffer, "Please Enter An Integer Between %i and %i", min, max );
 
@@ -178,7 +174,7 @@ bool ValidateTextIntRange( const char* pData, int min, int max, char* error_titl
        return FALSE;
 }
 
-bool ValidateTextInt( const char* pData, char* error_title, int* value ){
+bool ValidateTextInt( const char* pData, const char* error_title, int* value ){
        if ( pData ) {
                int testNum = atoi( pData );
 
@@ -209,129 +205,117 @@ bool ValidateTextInt( const char* pData, char* error_title, int* value ){
  */
 
 EMessageBoxReturn DoMessageBox( const char* lpText, const char* lpCaption, EMessageBoxType type ){
-       ui::Widget w, vbox, hbox;
+       ui::Widget w{ui::null};
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
-       g_signal_connect( GTK_OBJECT( window ), "delete_event",
-                                               G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy",
-                                               G_CALLBACK( gtk_widget_destroy ), NULL );
-       gtk_window_set_title( GTK_WINDOW( window ), lpCaption );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       gtk_window_set_title( window, lpCaption );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
        g_object_set_data( G_OBJECT( window ), "ret", &ret );
        gtk_widget_realize( window );
 
-       vbox = ui::VBox( FALSE, 10 );
+       auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        w = ui::Label( lpText );
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 2 );
+       vbox.pack_start( w, FALSE, FALSE, 2 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
-       w = ui::Widget(gtk_hseparator_new());
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 2 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 2 );
+       w.show();
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        if ( type == eMB_OK ) {
                w = ui::Button( "Ok" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
                gtk_widget_set_can_default(w, true);
                gtk_widget_grab_default( w );
-               gtk_widget_show( w );
+               w.show();
                ret = eIDOK;
        }
        else if ( type ==  eMB_OKCANCEL ) {
                w = ui::Button( "Ok" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
                gtk_widget_set_can_default( w, true );
                gtk_widget_grab_default( w );
-               gtk_widget_show( w );
+               w.show();
 
                w = ui::Button( "Cancel" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-               gtk_widget_show( w );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+               w.show();
                ret = eIDCANCEL;
        }
        else if ( type == eMB_YESNOCANCEL ) {
                w = ui::Button( "Yes" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
                gtk_widget_set_can_default( w, true );
                gtk_widget_grab_default( w );
-               gtk_widget_show( w );
+               w.show();
 
                w = ui::Button( "No" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
-               gtk_widget_show( w );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
+               w.show();
 
                w = ui::Button( "Cancel" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-               gtk_widget_show( w );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+               w.show();
                ret = eIDCANCEL;
        }
        else /* if (mode == MB_YESNO) */
        {
                w = ui::Button( "Yes" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
                gtk_widget_set_can_default( w, true );
                gtk_widget_grab_default( w );
-               gtk_widget_show( w );
+               w.show();
 
                w = ui::Button( "No" );
-               gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-               g_signal_connect( GTK_OBJECT( w ), "clicked",
-                                                       G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
-               gtk_widget_show( w );
+               hbox.pack_start( w, TRUE, TRUE, 0 );
+               w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
+               w.show();
                ret = eIDNO;
        }
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        while ( loop )
                gtk_main_iteration();
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
 
 EMessageBoxReturn DoIntersectBox( IntersectRS* rs ){
-       GtkWidget *w, *hbox;
-       GtkWidget *check1, *check2;
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Intersect" );
+       gtk_window_set_title( window, "Intersect" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -343,93 +327,88 @@ EMessageBoxReturn DoIntersectBox( IntersectRS* rs ){
 
        auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        // ---- vbox ----
 
 
-       auto radio1 = gtk_radio_button_new_with_label( NULL, "Use Whole Map" );
-       gtk_box_pack_start( GTK_BOX( vbox ), radio1, FALSE, FALSE, 2 );
-       gtk_widget_show( radio1 );
+       auto radio1 = ui::Widget::from(gtk_radio_button_new_with_label( NULL, "Use Whole Map" ));
+       vbox.pack_start( radio1, FALSE, FALSE, 2 );
+       radio1.show();
 
-       auto radio2 = gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1)), "Use Selected Brushes" );
-       gtk_box_pack_start( GTK_BOX( vbox ), radio2, FALSE, FALSE, 2 );
-       gtk_widget_show( radio2 );
+       auto radio2 = ui::Widget::from(gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio1)), "Use Selected Brushes" ));
+       vbox.pack_start( radio2, FALSE, FALSE, 2 );
+       radio2.show();
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 2 );
-       gtk_widget_show( w );
+       auto hsep = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( hsep, FALSE, FALSE, 2 );
+       hsep.show();
 
-       check1 = ui::CheckButton( "Include Detail Brushes" );
-       gtk_box_pack_start( GTK_BOX( vbox ), check1, FALSE, FALSE, 0 );
-       gtk_widget_show( check1 );
+       auto check1 = ui::CheckButton( "Include Detail Brushes" );
+       vbox.pack_start( check1, FALSE, FALSE, 0 );
+       check1.show();
 
-       check2 = ui::CheckButton( "Select Duplicate Brushes Only" );
-       gtk_box_pack_start( GTK_BOX( vbox ), check2, FALSE, FALSE, 0 );
-       gtk_widget_show( check2 );
+       auto check2 = ui::CheckButton( "Select Duplicate Brushes Only" );
+       vbox.pack_start( check2, FALSE, FALSE, 0 );
+       check2.show();
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ---- ok/cancel buttons
 
-       w = ui::Button( "Ok" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       auto w = ui::Button( "Ok" );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ---- /hbox ----
 
        // ---- /vbox ----
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        while ( loop )
                gtk_main_iteration();
 
-       if ( gtk_toggle_button_get_active( (GtkToggleButton*)radio1 ) ) {
+       if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radio1) ) ) {
                rs->nBrushOptions = BRUSH_OPT_WHOLE_MAP;
        }
-       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radio2 ) ) {
+       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radio2) ) ) {
                rs->nBrushOptions = BRUSH_OPT_SELECTED;
        }
 
-       rs->bUseDetail = gtk_toggle_button_get_active( (GtkToggleButton*)check1 ) ? true : false;
-       rs->bDuplicateOnly = gtk_toggle_button_get_active( (GtkToggleButton*)check2 ) ? true : false;
+       rs->bUseDetail = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check1) ) ? true : false;
+       rs->bDuplicateOnly = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check2) ) ? true : false;
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
 
 EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
-       GtkWidget *w, *hbox, *vbox2, *hbox2;
-
-       GtkWidget *check1, *check2, *check3;
-       GtkWidget *text1, *text2;
-
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Polygon Builder" );
+       gtk_window_set_title( window, "Polygon Builder" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -445,52 +424,52 @@ EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
 
        // ---- vbox ----
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+    auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
 
-       vbox2 = ui::VBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( hbox ), vbox2, FALSE, FALSE, 2 );
-       gtk_widget_show( vbox2 );
+    auto vbox2 = ui::VBox( FALSE, 10 );
+       hbox.pack_start( vbox2, FALSE, FALSE, 2 );
+       vbox2.show();
 
        // ---- vbox2 ----
 
-       hbox2 = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox2 ), hbox2, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox2 );
+    auto hbox2 = ui::HBox( FALSE, 10 );
+       vbox2.pack_start( hbox2, FALSE, FALSE, 2 );
+       hbox2.show();
 
        // ---- hbox2 ----
 
-       text1 = ui::Entry( 256 );
-       gtk_entry_set_text( (GtkEntry*)text1, "3" );
-       gtk_box_pack_start( GTK_BOX( hbox2 ), text1, FALSE, FALSE, 2 );
-       gtk_widget_show( text1 );
+    auto text1 = ui::Entry( 256 );
+       gtk_entry_set_text( text1, "3" );
+       hbox2.pack_start( text1, FALSE, FALSE, 2 );
+       text1.show();
 
-       w = ui::Label( "Number Of Sides" );
-       gtk_box_pack_start( GTK_BOX( hbox2 ), w, FALSE, FALSE, 2 );
-       gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       auto l = ui::Label( "Number Of Sides" );
+       hbox2.pack_start( l, FALSE, FALSE, 2 );
+       gtk_label_set_justify( GTK_LABEL( l ), GTK_JUSTIFY_LEFT );
+       l.show();
 
        // ---- /hbox2 ----
 
        hbox2 = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox2 ), hbox2, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox2 );
+       vbox2.pack_start( hbox2, FALSE, FALSE, 2 );
+       hbox2.show();
 
        // ---- hbox2 ----
 
-       text2 = ui::Entry( 256 );
-       gtk_entry_set_text( (GtkEntry*)text2, "8" );
-       gtk_box_pack_start( GTK_BOX( hbox2 ), text2, FALSE, FALSE, 2 );
-       gtk_widget_show( text2 );
+    auto text2 = ui::Entry( 256 );
+       gtk_entry_set_text( text2, "8" );
+       hbox2.pack_start( text2, FALSE, FALSE, 2 );
+       text2.show();
 
-       w = ui::Label( "Border Width" );
-       gtk_box_pack_start( GTK_BOX( hbox2 ), w, FALSE, FALSE, 2 );
-       gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       l = ui::Label( "Border Width" );
+       hbox2.pack_start( l, FALSE, FALSE, 2 );
+       gtk_label_set_justify( GTK_LABEL( l ), GTK_JUSTIFY_LEFT );
+       l.show();
 
        // ---- /hbox2 ----
 
@@ -499,55 +478,55 @@ EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
 
 
        vbox2 = ui::VBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( hbox ), vbox2, FALSE, FALSE, 2 );
-       gtk_widget_show( vbox2 );
+       hbox.pack_start( vbox2, FALSE, FALSE, 2 );
+       vbox2.show();
 
        // ---- vbox2 ----
 
-       check1 = ui::CheckButton( "Use Border" );
-       gtk_box_pack_start( GTK_BOX( vbox2 ), check1, FALSE, FALSE, 0 );
-       gtk_widget_show( check1 );
+    auto check1 = ui::CheckButton( "Use Border" );
+       vbox2.pack_start( check1, FALSE, FALSE, 0 );
+       check1.show();
 
 
-       check2 = ui::CheckButton( "Inverse Polygon" );
-       gtk_box_pack_start( GTK_BOX( vbox2 ), check2, FALSE, FALSE, 0 );
-       gtk_widget_show( check2 );
+    auto check2 = ui::CheckButton( "Inverse Polygon" );
+       vbox2.pack_start( check2, FALSE, FALSE, 0 );
+       check2.show();
 
 
-       check3 = ui::CheckButton( "Align Top Edge" );
-       gtk_box_pack_start( GTK_BOX( vbox2 ), check3, FALSE, FALSE, 0 );
-       gtk_widget_show( check3 );
+    auto check3 = ui::CheckButton( "Align Top Edge" );
+       vbox2.pack_start( check3, FALSE, FALSE, 0 );
+       check3.show();
 
        // ---- /vbox2 ----
 
        // ---- /hbox ----
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
-       w = ui::Button( "Ok" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       auto w = ui::Button( "Ok" );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ---- /hbox ----
 
        // ---- /vbox ----
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        bool dialogError = TRUE;
@@ -560,16 +539,16 @@ EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
                dialogError = FALSE;
 
                if ( ret == eIDOK ) {
-                       rs->bUseBorder = gtk_toggle_button_get_active( (GtkToggleButton*)check1 ) ? true : false;
-                       rs->bInverse = gtk_toggle_button_get_active( (GtkToggleButton*)check2 ) ? true : false;
-                       rs->bAlignTop = gtk_toggle_button_get_active( (GtkToggleButton*)check3 ) ? true : false;
+                       rs->bUseBorder = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check1) ) ? true : false;
+                       rs->bInverse = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check2) ) ? true : false;
+                       rs->bAlignTop = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(check3) ) ? true : false;
 
-                       if ( !ValidateTextIntRange( gtk_entry_get_text( (GtkEntry*)text1 ), 3, 32, "Number Of Sides", &rs->nSides ) ) {
+                       if ( !ValidateTextIntRange( gtk_entry_get_text( text1 ), 3, 32, "Number Of Sides", &rs->nSides ) ) {
                                dialogError = TRUE;
                        }
 
                        if ( rs->bUseBorder ) {
-                               if ( !ValidateTextIntRange( gtk_entry_get_text( (GtkEntry*)text2 ), 8, 256, "Border Width", &rs->nBorderWidth ) ) {
+                               if ( !ValidateTextIntRange( gtk_entry_get_text( text2 ), 8, 256, "Border Width", &rs->nBorderWidth ) ) {
                                        dialogError = TRUE;
                                }
                        }
@@ -577,7 +556,7 @@ EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
@@ -586,23 +565,18 @@ EMessageBoxReturn DoPolygonBox( PolygonRS* rs ){
 // for stair builder stuck as close as i could to the MFC version
 // obviously feel free to change it at will :)
 EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
-       GtkWidget   *w;
-       GtkWidget   *textStairHeight, *textRiserTex, *textMainTex;
-       GtkWidget   *radioNorth, *radioSouth, *radioEast, *radioWest;   // i'm guessing we can't just abuse 'w' for these if we're getting a value
-       GtkWidget   *radioOldStyle, *radioBobStyle, *radioCornerStyle;
-       GtkWidget   *checkUseDetail;
        GSList      *radioDirection, *radioStyle;
        EMessageBoxReturn ret;
        int loop = 1;
 
-       char *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
+       const char *text = "Please set a value in the boxes below and press 'OK' to build the stairs";
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Stair Builder" );
+       gtk_window_set_title( window, "Stair Builder" );
 
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
@@ -614,51 +588,51 @@ EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
        // new vbox
        auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        auto hbox = ui::HBox( FALSE, 10 );
        vbox.add(hbox);
-       gtk_widget_show( hbox );
+       hbox.show();
 
        // dunno if you want this text or not ...
-       w = ui::Label( text );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
-       gtk_widget_show( w );
+       ui::Widget w = ui::Label( text );
+       hbox.pack_start( w, FALSE, FALSE, 0 ); // not entirely sure on all the parameters / what they do ...
+       w.show();
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ------------------------- // indenting == good way of keeping track of lines :)
 
        // new hbox
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       textStairHeight = ui::Entry( 256 );
-       gtk_box_pack_start( GTK_BOX( hbox ), textStairHeight, FALSE, FALSE, 1 );
-       gtk_widget_show( textStairHeight );
+    auto textStairHeight = ui::Entry( 256 );
+       hbox.pack_start( textStairHeight, FALSE, FALSE, 1 );
+       textStairHeight.show();
 
        w = ui::Label( "Stair Height" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 1 );
+       w.show();
 
        // ------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Label( "Direction:" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 5 );
+       w.show();
 
        // -------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        // radio buttons confuse me ...
        // but this _looks_ right
@@ -666,59 +640,59 @@ EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
        // djbob: actually it looks very nice :), slightly better than the way i did it
        // edit: actually it doesn't work :P, you must pass the last radio item each time, ugh
 
-       radioNorth = gtk_radio_button_new_with_label( NULL, "North" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioNorth, FALSE, FALSE, 3 );
-       gtk_widget_show( radioNorth );
+    auto radioNorth = ui::Widget::from(gtk_radio_button_new_with_label( NULL, "North" ));
+       hbox.pack_start( radioNorth, FALSE, FALSE, 3 );
+       radioNorth.show();
 
        radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioNorth ) );
 
-       radioSouth = gtk_radio_button_new_with_label( radioDirection, "South" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioSouth, FALSE, FALSE, 2 );
-       gtk_widget_show( radioSouth );
+    auto radioSouth = ui::Widget::from(gtk_radio_button_new_with_label( radioDirection, "South" ));
+       hbox.pack_start( radioSouth, FALSE, FALSE, 2 );
+       radioSouth.show();
 
        radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioSouth ) );
 
-       radioEast = gtk_radio_button_new_with_label( radioDirection, "East" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioEast, FALSE, FALSE, 1 );
-       gtk_widget_show( radioEast );
+    auto radioEast = ui::Widget::from(gtk_radio_button_new_with_label( radioDirection, "East" ));
+       hbox.pack_start( radioEast, FALSE, FALSE, 1 );
+       radioEast.show();
 
        radioDirection = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioEast ) );
 
-       radioWest = gtk_radio_button_new_with_label( radioDirection, "West" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioWest, FALSE, FALSE, 0 );
-       gtk_widget_show( radioWest );
+    auto radioWest = ui::Widget::from(gtk_radio_button_new_with_label( radioDirection, "West" ));
+       hbox.pack_start( radioWest, FALSE, FALSE, 0 );
+       radioWest.show();
 
        // --------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Label( "Style:" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 5 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 5 );
+       w.show();
 
        // --------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       radioOldStyle = gtk_radio_button_new_with_label( NULL, "Original" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioOldStyle, FALSE, FALSE, 0 );
-       gtk_widget_show( radioOldStyle );
+    auto radioOldStyle = ui::Widget::from(gtk_radio_button_new_with_label( NULL, "Original" ));
+       hbox.pack_start( radioOldStyle, FALSE, FALSE, 0 );
+       radioOldStyle.show();
 
        radioStyle = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioOldStyle ) );
 
-       radioBobStyle = gtk_radio_button_new_with_label( radioStyle, "Bob's Style" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioBobStyle, FALSE, FALSE, 0 );
-       gtk_widget_show( radioBobStyle );
+    auto radioBobStyle = ui::Widget::from(gtk_radio_button_new_with_label( radioStyle, "Bob's Style" ));
+       hbox.pack_start( radioBobStyle, FALSE, FALSE, 0 );
+       radioBobStyle.show();
 
        radioStyle = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioBobStyle ) );
 
-       radioCornerStyle = gtk_radio_button_new_with_label( radioStyle, "Corner Style" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioCornerStyle, FALSE, FALSE, 0 );
-       gtk_widget_show( radioCornerStyle );
+    auto radioCornerStyle = ui::Widget::from(gtk_radio_button_new_with_label( radioStyle, "Corner Style" ));
+       hbox.pack_start( radioCornerStyle, FALSE, FALSE, 0 );
+       radioCornerStyle.show();
 
        // err, the q3r has an if or something so you need bob style checked before this
        // is "ungreyed out" but you'll need to do that, as i suck :)
@@ -727,65 +701,65 @@ EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
        // djbob: think we need some button callback functions or smuffin
        // FIXME: actually get around to doing what i suggested!!!!
 
-       checkUseDetail = ui::CheckButton( "Use Detail Brushes" );
-       gtk_box_pack_start( GTK_BOX( hbox ), checkUseDetail, FALSE, FALSE, 0 );
-       gtk_widget_show( checkUseDetail );
+    auto checkUseDetail = ui::CheckButton( "Use Detail Brushes" );
+       hbox.pack_start( checkUseDetail, FALSE, FALSE, 0 );
+       checkUseDetail.show();
 
        // --------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       textMainTex = ui::Entry( 512 );
+    auto textMainTex = ui::Entry( 512 );
        gtk_entry_set_text( GTK_ENTRY( textMainTex ), rs->mainTexture );
-       gtk_box_pack_start( GTK_BOX( hbox ), textMainTex, FALSE, FALSE, 0 );
-       gtk_widget_show( textMainTex );
+       hbox.pack_start( textMainTex, FALSE, FALSE, 0 );
+       textMainTex.show();
 
        w = ui::Label( "Main Texture" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 1 );
+       w.show();
 
        // -------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       textRiserTex = ui::Entry( 512 );
-       gtk_box_pack_start( GTK_BOX( hbox ), textRiserTex, FALSE, FALSE, 0 );
-       gtk_widget_show( textRiserTex );
+       auto textRiserTex = ui::Entry( 512 );
+       hbox.pack_start( textRiserTex, FALSE, FALSE, 0 );
+       textRiserTex.show();
 
        w = ui::Label( "Riser Texture" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 1 );
+       w.show();
 
        // -------------------------- //
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Button( "OK" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
 
        ret = eIDCANCEL;
 
 // +djbob: need our "little" modal loop mars :P
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        bool dialogError = TRUE;
@@ -798,42 +772,42 @@ EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
                dialogError = FALSE;
 
                if ( ret == eIDOK ) {
-                       rs->bUseDetail = gtk_toggle_button_get_active( (GtkToggleButton*)checkUseDetail ) ? true : false;
+                       rs->bUseDetail = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(checkUseDetail) ) ? true : false;
 
-                       strcpy( rs->riserTexture, gtk_entry_get_text( (GtkEntry*)textRiserTex ) );
-                       strcpy( rs->mainTexture, gtk_entry_get_text( (GtkEntry*)textMainTex ) );
+                       strcpy( rs->riserTexture, gtk_entry_get_text( textRiserTex ) );
+                       strcpy( rs->mainTexture, gtk_entry_get_text( textMainTex ) );
 
-                       if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioNorth ) ) {
+                       if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioNorth) ) ) {
                                rs->direction = MOVE_NORTH;
                        }
-                       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioSouth ) ) {
+                       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioSouth) ) ) {
                                rs->direction = MOVE_SOUTH;
                        }
-                       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioEast ) ) {
+                       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioEast) ) ) {
                                rs->direction = MOVE_EAST;
                        }
-                       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioWest ) ) {
+                       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioWest) ) ) {
                                rs->direction = MOVE_WEST;
                        }
 
-                       if ( !ValidateTextInt( gtk_entry_get_text( (GtkEntry*)textStairHeight ), "Stair Height", &rs->stairHeight ) ) {
+                       if ( !ValidateTextInt( gtk_entry_get_text( textStairHeight ), "Stair Height", &rs->stairHeight ) ) {
                                dialogError = TRUE;
                        }
 
-                       if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioOldStyle ) ) {
+                       if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioOldStyle) ) ) {
                                rs->style = STYLE_ORIGINAL;
                        }
-                       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioBobStyle ) ) {
+                       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioBobStyle) ) ) {
                                rs->style = STYLE_BOB;
                        }
-                       else if ( gtk_toggle_button_get_active( (GtkToggleButton*)radioCornerStyle ) ) {
+                       else if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(radioCornerStyle) ) ) {
                                rs->style = STYLE_CORNER;
                        }
                }
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 // -djbob
@@ -842,12 +816,6 @@ EMessageBoxReturn DoBuildStairsBox( BuildStairsRS* rs ){
 }
 
 EMessageBoxReturn DoDoorsBox( DoorRS* rs ){
-       GtkWidget   *hbox, *w;
-       GtkWidget   *textFrontBackTex, *textTrimTex;
-       GtkWidget   *checkScaleMainH, *checkScaleMainV, *checkScaleTrimH, *checkScaleTrimV;
-       GtkWidget   *comboMain, *comboTrim;
-       GtkWidget   *buttonSetMain, *buttonSetTrim;
-       GtkWidget   *radioNS, *radioEW;
        GSList      *radioOrientation;
        TwinWidget tw1, tw2;
        EMessageBoxReturn ret;
@@ -855,10 +823,10 @@ EMessageBoxReturn DoDoorsBox( DoorRS* rs ){
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Door Builder" );
+       gtk_window_set_title( window, "Door Builder" );
 
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
@@ -868,168 +836,168 @@ EMessageBoxReturn DoDoorsBox( DoorRS* rs ){
        gtk_widget_realize( window );
 
        char buffer[256];
-       ui::ListStore listMainTextures = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
-       ui::ListStore listTrimTextures = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
+       auto listMainTextures = ui::ListStore::from(gtk_list_store_new( 1, G_TYPE_STRING ));
+       auto listTrimTextures = ui::ListStore::from(gtk_list_store_new( 1, G_TYPE_STRING ));
        LoadGList( GetFilename( buffer, "plugins/bt/door-tex.txt" ), listMainTextures );
        LoadGList( GetFilename( buffer, "plugins/bt/door-tex-trim.txt" ), listTrimTextures );
 
        auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        // -------------------------- //
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+    auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       textFrontBackTex = ui::Entry( 512 );
+       auto textFrontBackTex = ui::Entry( 512 );
        gtk_entry_set_text( GTK_ENTRY( textFrontBackTex ), rs->mainTexture );
-       gtk_box_pack_start( GTK_BOX( hbox ), textFrontBackTex, FALSE, FALSE, 0 );
-       gtk_widget_show( textFrontBackTex );
+       hbox.pack_start( textFrontBackTex, FALSE, FALSE, 0 );
+       textFrontBackTex.show();
 
-       w = ui::Label( "Door Front/Back Texture" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       ui::Widget w = ui::Label( "Door Front/Back Texture" );
+       hbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ------------------------ //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       textTrimTex = ui::Entry( 512 );
-       gtk_box_pack_start( GTK_BOX( hbox ), textTrimTex, FALSE, FALSE, 0 );
-       gtk_widget_show( textTrimTex );
+       auto textTrimTex = ui::Entry( 512 );
+       hbox.pack_start( textTrimTex, FALSE, FALSE, 0 );
+       textTrimTex.show();
 
        w = ui::Label( "Door Trim Texture" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ----------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        // sp: horizontally ????
        // djbob: yes mars, u can spell :]
-       checkScaleMainH = ui::CheckButton( "Scale Main Texture Horizontally" );
+    auto checkScaleMainH = ui::CheckButton( "Scale Main Texture Horizontally" );
        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleMainH ), TRUE );
-       gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainH, FALSE, FALSE, 0 );
-       gtk_widget_show( checkScaleMainH );
+       hbox.pack_start( checkScaleMainH, FALSE, FALSE, 0 );
+       checkScaleMainH.show();
 
-       checkScaleTrimH = ui::CheckButton( "Scale Trim Texture Horizontally" );
+    auto checkScaleTrimH = ui::CheckButton( "Scale Trim Texture Horizontally" );
        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleTrimH ), TRUE );
-       gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimH, FALSE, FALSE, 0 );
-       gtk_widget_show( checkScaleTrimH );
+       hbox.pack_start( checkScaleTrimH, FALSE, FALSE, 0 );
+       checkScaleTrimH.show();
 
        // ---------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       checkScaleMainV = ui::CheckButton( "Scale Main Texture Vertically" );
+    auto checkScaleMainV = ui::CheckButton( "Scale Main Texture Vertically" );
        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( checkScaleMainV ), TRUE );
-       gtk_box_pack_start( GTK_BOX( hbox ), checkScaleMainV, FALSE, FALSE, 0 );
-       gtk_widget_show( checkScaleMainV );
+       hbox.pack_start( checkScaleMainV, FALSE, FALSE, 0 );
+       checkScaleMainV.show();
 
-       checkScaleTrimV = ui::CheckButton( "Scale Trim Texture Vertically" );
-       gtk_box_pack_start( GTK_BOX( hbox ), checkScaleTrimV, FALSE, FALSE, 0 );
-       gtk_widget_show( checkScaleTrimV );
+    auto checkScaleTrimV = ui::CheckButton( "Scale Trim Texture Vertically" );
+       hbox.pack_start( checkScaleTrimV, FALSE, FALSE, 0 );
+       checkScaleTrimV.show();
 
        // --------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        // djbob: lists added
 
-       comboMain = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(listMainTextures));
+       auto comboMain = ui::ComboBox::from(gtk_combo_box_new_with_model_and_entry(listMainTextures));
        gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(comboMain), 0);
-       gtk_box_pack_start( GTK_BOX( hbox ), comboMain, FALSE, FALSE, 0 );
-       gtk_widget_show( comboMain );
+       hbox.pack_start( comboMain, FALSE, FALSE, 0 );
+       comboMain.show();
 
        tw1.one = textFrontBackTex;
-       tw1.two = GTK_COMBO_BOX(comboMain);
+       tw1.two = comboMain;
 
-       buttonSetMain = ui::Button( "Set As Main Texture" );
-       g_signal_connect( GTK_OBJECT( buttonSetMain ), "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw1 );
-       gtk_box_pack_start( GTK_BOX( hbox ), buttonSetMain, FALSE, FALSE, 0 );
-       gtk_widget_show( buttonSetMain );
+       auto buttonSetMain = ui::Button( "Set As Main Texture" );
+       buttonSetMain.connect( "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw1 );
+       hbox.pack_start( buttonSetMain, FALSE, FALSE, 0 );
+       buttonSetMain.show();
 
        // ------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
-       comboTrim = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(listTrimTextures));
+       auto comboTrim = ui::ComboBox::from(gtk_combo_box_new_with_model_and_entry(listTrimTextures));
        gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(comboMain), 0);
-       gtk_box_pack_start( GTK_BOX( hbox ), comboTrim, FALSE, FALSE, 0 );
-       gtk_widget_show( comboTrim );
+       hbox.pack_start( comboTrim, FALSE, FALSE, 0 );
+       comboTrim.show();
 
        tw2.one = textTrimTex;
-       tw2.two = GTK_COMBO_BOX(comboTrim);
+       tw2.two = comboTrim;
 
-       buttonSetTrim = ui::Button( "Set As Trim Texture" );
-       g_signal_connect( GTK_OBJECT( buttonSetTrim ), "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw2 );
-       gtk_box_pack_start( GTK_BOX( hbox ), buttonSetTrim, FALSE, FALSE, 0 );
-       gtk_widget_show( buttonSetTrim );
+       auto buttonSetTrim = ui::Button( "Set As Trim Texture" );
+       buttonSetTrim.connect( "clicked", G_CALLBACK( dialog_button_callback_settex ), &tw2 );
+       hbox.pack_start( buttonSetTrim, FALSE, FALSE, 0 );
+       buttonSetTrim.show();
 
        // ------------------ //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Label( "Orientation" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // argh more radio buttons!
-       radioNS = gtk_radio_button_new_with_label( NULL, "North - South" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioNS, FALSE, FALSE, 0 );
-       gtk_widget_show( radioNS );
+    auto radioNS = ui::Widget::from(gtk_radio_button_new_with_label( NULL, "North - South" ));
+       hbox.pack_start( radioNS, FALSE, FALSE, 0 );
+       radioNS.show();
 
        radioOrientation = gtk_radio_button_get_group( GTK_RADIO_BUTTON( radioNS ) );
 
-       radioEW = gtk_radio_button_new_with_label( radioOrientation, "East - West" );
-       gtk_box_pack_start( GTK_BOX( hbox ), radioEW, FALSE, FALSE, 0 );
-       gtk_widget_show( radioEW );
+    auto radioEW = ui::Widget::from(gtk_radio_button_new_with_label( radioOrientation, "East - West" ));
+       hbox.pack_start( radioEW, FALSE, FALSE, 0 );
+       radioEW.show();
 
        // ----------------- //
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ----------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Button( "OK" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ----------------- //
 
 //+djbob
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        while ( loop )
@@ -1051,27 +1019,24 @@ EMessageBoxReturn DoDoorsBox( DoorRS* rs ){
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 //-djbob
 }
 
 EMessageBoxReturn DoPathPlotterBox( PathPlotterRS* rs ){
-       GtkWidget *w, *hbox;
-
-       GtkWidget *text1, *text2, *text3;
-       GtkWidget *check1, *check2;
+       ui::Widget w{ui::null};
 
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Texture Reset" );
+       gtk_window_set_title( window, "Texture Reset" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -1083,120 +1048,120 @@ EMessageBoxReturn DoPathPlotterBox( PathPlotterRS* rs ){
 
        auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        // ---- vbox ----
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
-       text1 = ui::Entry( 256 );
-       gtk_entry_set_text( (GtkEntry*)text1, "25" );
-       gtk_box_pack_start( GTK_BOX( hbox ), text1, FALSE, FALSE, 2 );
-       gtk_widget_show( text1 );
+       auto text1 = ui::Entry( 256 );
+       gtk_entry_set_text( text1, "25" );
+       hbox.pack_start( text1, FALSE, FALSE, 2 );
+       text1.show();
 
        w = ui::Label( "Number Of Points" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 2 );
+       hbox.pack_start( w, FALSE, FALSE, 2 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
        // ---- /hbox ----
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
-       text2 = ui::Entry( 256 );
-       gtk_entry_set_text( (GtkEntry*)text2, "3" );
-       gtk_box_pack_start( GTK_BOX( hbox ), text2, FALSE, FALSE, 2 );
-       gtk_widget_show( text2 );
+       auto text2 = ui::Entry( 256 );
+       gtk_entry_set_text( text2, "3" );
+       hbox.pack_start( text2, FALSE, FALSE, 2 );
+       text2.show();
 
        w = ui::Label( "Multipler" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 2 );
+       hbox.pack_start( w, FALSE, FALSE, 2 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
        // ---- /hbox ----
 
        w = ui::Label( "Path Distance = dist(start -> apex) * multiplier" );
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
+       vbox.pack_start( w, FALSE, FALSE, 0 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
-       text3 = ui::Entry( 256 );
-       gtk_entry_set_text( (GtkEntry*)text3, "-800" );
-       gtk_box_pack_start( GTK_BOX( hbox ), text3, FALSE, FALSE, 2 );
-       gtk_widget_show( text3 );
+       auto text3 = ui::Entry( 256 );
+       gtk_entry_set_text( text3, "-800" );
+       hbox.pack_start( text3, FALSE, FALSE, 2 );
+       text3.show();
 
        w = ui::Label( "Gravity" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 2 );
+       hbox.pack_start( w, FALSE, FALSE, 2 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
        // ---- /hbox ----
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
-       check1 = ui::CheckButton( "No Dynamic Update" );
-       gtk_box_pack_start( GTK_BOX( vbox ), check1, FALSE, FALSE, 0 );
-       gtk_widget_show( check1 );
+       auto check1 = ui::CheckButton( "No Dynamic Update" );
+       vbox.pack_start( check1, FALSE, FALSE, 0 );
+       check1.show();
 
-       check2 = ui::CheckButton( "Show Bounding Lines" );
-       gtk_box_pack_start( GTK_BOX( vbox ), check2, FALSE, FALSE, 0 );
-       gtk_widget_show( check2 );
+       auto check2 = ui::CheckButton( "Show Bounding Lines" );
+       vbox.pack_start( check2, FALSE, FALSE, 0 );
+       check2.show();
 
        // ---- /vbox ----
 
 
        // ----------------- //
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ----------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        w = ui::Button( "Enable" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
+       w.show();
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
 
        w = ui::Button( "Disable" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDNO ) );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
 
        ret = eIDCANCEL;
 
        // ----------------- //
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        bool dialogError = TRUE;
@@ -1227,22 +1192,22 @@ EMessageBoxReturn DoPathPlotterBox( PathPlotterRS* rs ){
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
 
 EMessageBoxReturn DoCTFColourChangeBox(){
-       GtkWidget *w, *hbox;
+       ui::Widget w{ui::null};
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "CTF Colour Changer" );
+       gtk_window_set_title( window, "CTF Colour Changer" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -1254,48 +1219,48 @@ EMessageBoxReturn DoCTFColourChangeBox(){
 
        auto vbox = ui::VBox( FALSE, 10 );
        window.add(vbox);
-       gtk_widget_show( vbox );
+       vbox.show();
 
        // ---- vbox ----
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, TRUE, TRUE, 0 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, TRUE, TRUE, 0 );
+       hbox.show();
 
        // ---- hbox ---- ok/cancel buttons
 
        w = ui::Button( "Red->Blue" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Blue->Red" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ---- /hbox ----
 
        // ---- /vbox ----
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        while ( loop )
                gtk_main_iteration();
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
@@ -1303,17 +1268,17 @@ EMessageBoxReturn DoCTFColourChangeBox(){
 EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
        Str texSelected;
 
-       GtkWidget *w, *hbox;
+       ui::Widget w{ui::null};
 
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Texture Reset" );
+       gtk_window_set_title( window, "Texture Reset" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -1327,9 +1292,9 @@ EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
 
        // ---- vbox ----
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
@@ -1337,237 +1302,197 @@ EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
        texSelected += GetCurrentTexture();
 
        w = ui::Label( texSelected );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 2 );
+       hbox.pack_start( w, FALSE, FALSE, 2 );
        gtk_label_set_justify( GTK_LABEL( w ), GTK_JUSTIFY_LEFT );
-       gtk_widget_show( w );
+       w.show();
 
        // ---- /hbox ----
 
        auto frame = ui::Frame( "Reset Texture Names" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        auto table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        dlgTexReset.cbTexChange = ui::CheckButton( "Enabled" );
-       g_signal_connect( GTK_OBJECT( dlgTexReset.cbTexChange ), "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
-       gtk_widget_show( dlgTexReset.cbTexChange );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbTexChange, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbTexChange.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
+       dlgTexReset.cbTexChange.show();
+       table.attach(dlgTexReset.cbTexChange, {0, 1, 0, 1}, {GTK_FILL, 0});
 
        w = ui::Label( "Old Name: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editTexOld = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editTexOld ), rs->textureName );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editTexOld, 2, 3, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editTexOld );
+       table.attach(dlgTexReset.editTexOld, {2, 3, 0, 1}, {GTK_FILL, 0});
+       dlgTexReset.editTexOld.show();
 
        w = ui::Label( "New Name: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editTexNew = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editTexNew ), rs->textureName );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editTexNew, 2, 3, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editTexNew );
+       table.attach(dlgTexReset.editTexNew, {2, 3, 1, 2}, {GTK_FILL, 0});
+       dlgTexReset.editTexNew.show();
 
        // ---- /frame ----
 
        frame = ui::Frame( "Reset Scales" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        dlgTexReset.cbScaleHor = ui::CheckButton( "Enabled" );
-       g_signal_connect( GTK_OBJECT( dlgTexReset.cbScaleHor ), "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
-       gtk_widget_show( dlgTexReset.cbScaleHor );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbScaleHor, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbScaleHor.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
+       dlgTexReset.cbScaleHor.show();
+       table.attach(dlgTexReset.cbScaleHor, {0, 1, 0, 1}, {GTK_FILL, 0});
 
        w = ui::Label( "New Horizontal Scale: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editScaleHor = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editScaleHor ), "0.5" );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editScaleHor, 2, 3, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editScaleHor );
+       table.attach(dlgTexReset.editScaleHor, {2, 3, 0, 1}, {GTK_FILL, 0});
+       dlgTexReset.editScaleHor.show();
 
 
        dlgTexReset.cbScaleVert = ui::CheckButton( "Enabled" );
-       g_signal_connect( GTK_OBJECT( dlgTexReset.cbScaleVert ), "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
-       gtk_widget_show( dlgTexReset.cbScaleVert );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbScaleVert, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbScaleVert.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
+       dlgTexReset.cbScaleVert.show();
+       table.attach(dlgTexReset.cbScaleVert, {0, 1, 1, 2}, {GTK_FILL, 0});
 
        w = ui::Label( "New Vertical Scale: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editScaleVert = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editScaleVert ), "0.5" );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editScaleVert, 2, 3, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editScaleVert );
+       table.attach(dlgTexReset.editScaleVert, {2, 3, 1, 2}, {GTK_FILL, 0});
+       dlgTexReset.editScaleVert.show();
 
        // ---- /frame ----
 
        frame = ui::Frame( "Reset Shift" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        dlgTexReset.cbShiftHor = ui::CheckButton( "Enabled" );
-       g_signal_connect( GTK_OBJECT( dlgTexReset.cbShiftHor ), "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
-       gtk_widget_show( dlgTexReset.cbShiftHor );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbShiftHor, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbShiftHor.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
+       dlgTexReset.cbShiftHor.show();
+       table.attach(dlgTexReset.cbShiftHor, {0, 1, 0, 1}, {GTK_FILL, 0});
 
        w = ui::Label( "New Horizontal Shift: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editShiftHor = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editShiftHor ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editShiftHor, 2, 3, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editShiftHor );
+       table.attach(dlgTexReset.editShiftHor, {2, 3, 0, 1}, {GTK_FILL, 0});
+       dlgTexReset.editShiftHor.show();
 
 
        dlgTexReset.cbShiftVert = ui::CheckButton( "Enabled" );
-       g_signal_connect( GTK_OBJECT( dlgTexReset.cbShiftVert ), "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
-       gtk_widget_show( dlgTexReset.cbShiftVert );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbShiftVert, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbShiftVert.connect( "toggled", G_CALLBACK( dialog_button_callback_texreset_update ), NULL );
+       dlgTexReset.cbShiftVert.show();
+       table.attach(dlgTexReset.cbShiftVert, {0, 1, 1, 2}, {GTK_FILL, 0});
 
        w = ui::Label( "New Vertical Shift: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editShiftVert = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editShiftVert ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editShiftVert, 2, 3, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editShiftVert );
+       table.attach(dlgTexReset.editShiftVert, {2, 3, 1, 2}, {GTK_FILL, 0});
+       dlgTexReset.editShiftVert.show();
 
        // ---- /frame ----
 
        frame = ui::Frame( "Reset Rotation" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 1, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        dlgTexReset.cbRotation = ui::CheckButton( "Enabled" );
-       gtk_widget_show( dlgTexReset.cbRotation );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.cbRotation, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
+       dlgTexReset.cbRotation.show();
+       table.attach(dlgTexReset.cbRotation, {0, 1, 0, 1}, {GTK_FILL, 0});
 
        w = ui::Label( "New Rotation Value: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {1, 2, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        dlgTexReset.editRotation = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( dlgTexReset.editRotation ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), dlgTexReset.editRotation, 2, 3, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( dlgTexReset.editRotation );
+       table.attach(dlgTexReset.editRotation, {2, 3, 0, 1}, {GTK_FILL, 0});
+       dlgTexReset.editRotation.show();
 
        // ---- /frame ----
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
        w = ui::Button( "Use Selected Brushes" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Use All Brushes" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDYES ) );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ---- /hbox ----
 
        // ---- /vbox ----
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        Update_TextureReseter();
@@ -1626,7 +1551,7 @@ EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
@@ -1634,22 +1559,22 @@ EMessageBoxReturn DoResetTextureBox( ResetTextureRS* rs ){
 EMessageBoxReturn DoTrainThingBox( TrainThingRS* rs ){
        Str texSelected;
 
-       GtkWidget *w, *hbox;
+       ui::Widget w{ui::null};
 
-       GtkWidget *radiusX, *radiusY;
-       GtkWidget *angleStart, *angleEnd;
-       GtkWidget *heightStart, *heightEnd;
-       GtkWidget *numPoints;
+       ui::Widget radiusX{ui::null}, radiusY{ui::null};
+       ui::Widget angleStart{ui::null}, angleEnd{ui::null};
+       ui::Widget heightStart{ui::null}, heightEnd{ui::null};
+       ui::Widget numPoints{ui::null};
 
        EMessageBoxReturn ret;
        int loop = 1;
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Train Thing" );
+       gtk_window_set_title( window, "Train Thing" );
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
        g_object_set_data( G_OBJECT( window ), "loop", &loop );
@@ -1663,193 +1588,165 @@ EMessageBoxReturn DoTrainThingBox( TrainThingRS* rs ){
 
        // ---- vbox ----
 
-       hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       auto hbox = ui::HBox( FALSE, 10 );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- /hbox ----
 
        auto frame = ui::Frame( "Radii" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        auto table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        w = ui::Label( "X: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        radiusX = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( radiusX ), "100" );
-       gtk_table_attach( GTK_TABLE( table ), radiusX, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( radiusX );
+       table.attach(radiusX, {1, 2, 0, 1}, {GTK_FILL, 0});
+       radiusX.show();
 
 
 
        w = ui::Label( "Y: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        radiusY = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( radiusY ), "100" );
-       gtk_table_attach( GTK_TABLE( table ), radiusY, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( radiusY );
+       table.attach(radiusY, {1, 2, 1, 2}, {GTK_FILL, 0});
+       radiusY.show();
 
 
 
        frame = ui::Frame( "Angles" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings((table), 5);
+       gtk_table_set_col_spacings((table), 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        w = ui::Label( "Start: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        angleStart = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( angleStart ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), angleStart, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( angleStart );
+       table.attach(angleStart, {1, 2, 0, 1}, {GTK_FILL, 0});
+       angleStart.show();
 
 
 
        w = ui::Label( "End: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        angleEnd = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( angleEnd ), "90" );
-       gtk_table_attach( GTK_TABLE( table ), angleEnd, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( angleEnd );
+       table.attach(angleEnd, {1, 2, 1, 2}, {GTK_FILL, 0});
+       angleEnd.show();
 
 
        frame = ui::Frame( "Height" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        w = ui::Label( "Start: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        heightStart = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( heightStart ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), heightStart, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( heightStart );
+       table.attach(heightStart, {1, 2, 0, 1}, {GTK_FILL, 0});
+       heightStart.show();
 
 
 
        w = ui::Label( "End: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 1, 2}, {GTK_FILL, 0});
+       w.show();
 
        heightEnd = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( heightEnd ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), heightEnd, 1, 2, 1, 2,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( heightEnd );
+       table.attach(heightEnd, {1, 2, 1, 2}, {GTK_FILL, 0});
+       heightEnd.show();
 
 
 
        frame = ui::Frame( "Points" );
-       gtk_widget_show( frame );
-       gtk_box_pack_start( GTK_BOX( vbox ), frame, FALSE, TRUE, 0 );
+       frame.show();
+       vbox.pack_start( frame, FALSE, TRUE, 0 );
 
        table = ui::Table( 2, 3, TRUE );
        table.show();
        frame.add(table);
-       gtk_table_set_row_spacings( GTK_TABLE( table ), 5 );
-       gtk_table_set_col_spacings( GTK_TABLE( table ), 5 );
+       gtk_table_set_row_spacings(table, 5);
+       gtk_table_set_col_spacings(table, 5);
        gtk_container_set_border_width( GTK_CONTAINER( table ), 5 );
 
        // ---- frame ----
 
        w = ui::Label( "Number: " );
-       gtk_table_attach( GTK_TABLE( table ), w, 0, 1, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( w );
+       table.attach(w, {0, 1, 0, 1}, {GTK_FILL, 0});
+       w.show();
 
        numPoints = ui::Entry( 256 );
        gtk_entry_set_text( GTK_ENTRY( numPoints ), "0" );
-       gtk_table_attach( GTK_TABLE( table ), numPoints, 1, 2, 0, 1,
-                                         (GtkAttachOptions) ( GTK_FILL ),
-                                         (GtkAttachOptions) ( 0 ), 0, 0 );
-       gtk_widget_show( numPoints );
+       table.attach(numPoints, {1, 2, 0, 1}, {GTK_FILL, 0});
+       numPoints.show();
 
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 2 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 2 );
+       hbox.show();
 
        // ---- hbox ----
 
        w = ui::Button( "Ok" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
 
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
        ret = eIDCANCEL;
 
        // ---- /hbox ----
 
 
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position( window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        bool dialogError = TRUE;
@@ -1893,26 +1790,26 @@ EMessageBoxReturn DoTrainThingBox( TrainThingRS* rs ){
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }
 // ailmanki
 // add a simple input for the MakeChain thing..
 EMessageBoxReturn DoMakeChainBox( MakeChainRS* rs ){
-       GtkWidget   *w;
-       GtkWidget   *textlinkNum, *textlinkName;
+       ui::Widget   w{ui::null};
+       ui::Entry textlinkNum{ui::null}, textlinkName{ui::null};
        EMessageBoxReturn ret;
        int loop = 1;
 
-       char const *text = "Please set a value in the boxes below and press 'OK' to make a chain";
+       const char *text = "Please set a value in the boxes below and press 'OK' to make a chain";
 
        auto window = ui::Window( ui::window_type::TOP );
 
-       g_signal_connect( GTK_OBJECT( window ), "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
-       g_signal_connect( GTK_OBJECT( window ), "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
+       window.connect( "delete_event", G_CALLBACK( dialog_delete_callback ), NULL );
+       window.connect( "destroy", G_CALLBACK( gtk_widget_destroy ), NULL );
 
-       gtk_window_set_title( GTK_WINDOW( window ), "Make Chain" );
+       gtk_window_set_title( window, "Make Chain" );
 
        gtk_container_set_border_width( GTK_CONTAINER( window ), 10 );
 
@@ -1932,59 +1829,59 @@ EMessageBoxReturn DoMakeChainBox( MakeChainRS* rs ){
 
        // dunno if you want this text or not ...
        w = ui::Label( text );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
-       w = gtk_hseparator_new();
-       gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
-       gtk_widget_show( w );
+       w = ui::Widget::from(gtk_hseparator_new());
+       vbox.pack_start( w, FALSE, FALSE, 0 );
+       w.show();
 
        // ------------------------- //
 
        // new hbox
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        textlinkNum = ui::Entry( 256 );
-       gtk_box_pack_start( GTK_BOX( hbox ), textlinkNum, FALSE, FALSE, 1 );
-       gtk_widget_show( textlinkNum );
+       hbox.pack_start( textlinkNum, FALSE, FALSE, 1 );
+       textlinkNum.show();
 
        w = ui::Label( "Number of elements in chain" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 1 );
+       w.show();
 
        // -------------------------- //
 
        hbox = ui::HBox( FALSE, 10 );
-       gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 );
-       gtk_widget_show( hbox );
+       vbox.pack_start( hbox, FALSE, FALSE, 0 );
+       hbox.show();
 
        textlinkName = ui::Entry( 256 );
-       gtk_box_pack_start( GTK_BOX( hbox ), textlinkName, FALSE, FALSE, 0 );
-       gtk_widget_show( textlinkName );
+       hbox.pack_start( textlinkName, FALSE, FALSE, 0 );
+       textlinkName.show();
 
        w = ui::Label( "Basename for chain's targetnames." );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 1 );
-       gtk_widget_show( w );
+       hbox.pack_start( w, FALSE, FALSE, 1 );
+       w.show();
 
 
        w = ui::Button( "OK" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDOK ) );
        gtk_widget_set_can_default( w, true );
        gtk_widget_grab_default( w );
-       gtk_widget_show( w );
+       w.show();
 
        w = ui::Button( "Cancel" );
-       gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
-       g_signal_connect( GTK_OBJECT( w ), "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
-       gtk_widget_show( w );
+       hbox.pack_start( w, TRUE, TRUE, 0 );
+       w.connect( "clicked", G_CALLBACK( dialog_button_callback ), GINT_TO_POINTER( eIDCANCEL ) );
+       w.show();
 
        ret = eIDCANCEL;
 
-       gtk_window_set_position( GTK_WINDOW( window ),GTK_WIN_POS_CENTER );
-       gtk_widget_show( window );
+       gtk_window_set_position(  window, GTK_WIN_POS_CENTER );
+       window.show();
        gtk_grab_add( window );
 
        bool dialogError = TRUE;
@@ -1997,15 +1894,15 @@ EMessageBoxReturn DoMakeChainBox( MakeChainRS* rs ){
                dialogError = FALSE;
 
                if ( ret == eIDOK ) {
-                       strcpy( rs->linkName, gtk_entry_get_text( (GtkEntry*)textlinkName ) );
-                       if ( !ValidateTextInt( gtk_entry_get_text( (GtkEntry*)textlinkNum ), "Elements", &rs->linkNum ) ) {
+                       strcpy( rs->linkName, gtk_entry_get_text( textlinkName ) );
+                       if ( !ValidateTextInt( gtk_entry_get_text( textlinkNum ), "Elements", &rs->linkNum ) ) {
                                dialogError = TRUE;
                        }
                }
        }
 
        gtk_grab_remove( window );
-       gtk_widget_destroy( window );
+       window.destroy();
 
        return ret;
 }