]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/xywindow.cpp
Merge commit 'dd7f4f1689e8ede7580bdfa8e08d0b78d08f5253' into garux-merge
[xonotic/netradiant.git] / radiant / xywindow.cpp
index 8b2da7cbd24ecec059b97671c0e48142cead2595..6da0a4b25fefd0907a712493a7da1f2906553915 100644 (file)
@@ -27,6 +27,8 @@
 
 #include "xywindow.h"
 
+#include <gtk/gtk.h>
+
 #include "debugging/debugging.h"
 
 #include "ientity.h"
@@ -39,8 +41,8 @@
 #include "image.h"
 #include "gtkutil/messagebox.h"
 
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmenuitem.h>
+#include <uilib/uilib.h>
+#include <gdk/gdkkeysyms.h>
 
 #include "generic/callback.h"
 #include "string/string.h"
@@ -357,6 +359,8 @@ struct xywindow_globals_private_t
        bool m_bChaseMouse;
        bool m_bSizePaint;
 
+       bool g_bCrossHairs;
+
        xywindow_globals_private_t() :
                d_showgrid( true ),
 
@@ -372,7 +376,9 @@ struct xywindow_globals_private_t
 
 //             m_bCamXYUpdate( true ),
                m_bChaseMouse( true ),
-               m_bSizePaint( true ){
+               m_bSizePaint( true ),
+
+               g_bCrossHairs( false ){
        }
 
 };
@@ -421,6 +427,7 @@ inline unsigned int buttons_for_button_and_modifiers( ButtonIdentifier button, M
 
        switch ( button.get() )
        {
+    case ButtonEnumeration::INVALID: break;
        case ButtonEnumeration::LEFT: buttons |= RAD_LBUTTON; break;
        case ButtonEnumeration::MIDDLE: buttons |= RAD_MBUTTON; break;
        case ButtonEnumeration::RIGHT: buttons |= RAD_RBUTTON; break;
@@ -559,9 +566,7 @@ VIEWTYPE GlobalXYWnd_getCurrentViewType(){
 // =============================================================================
 // variables
 
-bool g_bCrossHairs = false;
-
-GtkMenu* XYWnd::m_mnuDrop = 0;
+ui::Menu XYWnd::m_mnuDrop(ui::null);
 
 // this is disabled, and broken
 // http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=394
@@ -573,7 +578,7 @@ void WXY_Print(){
        unsigned char* img;
        const char* filename;
 
-       filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), FALSE, "Save Image", 0, FILTER_BMP );
+       filename = ui::file_dialog( MainFrame_getWindow( ), FALSE, "Save Image", 0, FILTER_BMP );
        if ( !filename ) {
                return;
        }
@@ -730,7 +735,7 @@ bool XYWnd::chaseMouseMotion( int pointx, int pointy ){
 Shader* XYWnd::m_state_selected = 0;
 
 void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
-       if ( GTK_WIDGET_VISIBLE( self.GetWidget() ) ) {
+       if ( self.GetWidget().visible() ) {
                rectangle_t rect = rectangle_from_area( area.min, area.max, self.Width(), self.Height() );
 //             int nDim1 = ( self.GetViewType() == YZ ) ? 1 : 0;
 //             int nDim2 = ( self.GetViewType() == XY ) ? 1 : 2;
@@ -744,7 +749,7 @@ void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
        }
 }
 
-gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){
+gboolean xywnd_button_press( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){
        if ( event->type == GDK_BUTTON_PRESS ) {
                if( !xywnd->Active() ){
                        g_pParentWnd->SetActiveXY( xywnd );
@@ -757,7 +762,7 @@ gboolean xywnd_button_press( GtkWidget* widget, GdkEventButton* event, XYWnd* xy
        return FALSE;
 }
 
-gboolean xywnd_button_release( GtkWidget* widget, GdkEventButton* event, XYWnd* xywnd ){
+gboolean xywnd_button_release( ui::Widget widget, GdkEventButton* event, XYWnd* xywnd ){
        if ( event->type == GDK_BUTTON_RELEASE ) {
                xywnd->XY_MouseUp( static_cast<int>( event->x ), static_cast<int>( event->y ), buttons_for_event_button( event ) );
 
@@ -766,7 +771,7 @@ gboolean xywnd_button_release( GtkWidget* widget, GdkEventButton* event, XYWnd*
        return FALSE;
 }
 
-gboolean xywnd_focus_in( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){
+gboolean xywnd_focus_in( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){
        if ( event->type == GDK_FOCUS_CHANGE ) {
                if ( event->in ) {
                        if( !xywnd->Active() ){
@@ -784,7 +789,7 @@ void xywnd_motion( gdouble x, gdouble y, guint state, void* data ){
        reinterpret_cast<XYWnd*>( data )->XY_MouseMoved( static_cast<int>( x ), static_cast<int>( y ), buttons_for_state( state ) );
 }
 
-gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xywnd ){
+gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){
        if( !xywnd->Active() ){
                g_pParentWnd->SetActiveXY( xywnd );
        }
@@ -797,7 +802,7 @@ gboolean xywnd_wheel_scroll( GtkWidget* widget, GdkEventScroll* event, XYWnd* xy
        return FALSE;
 }
 
-gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWnd* xywnd ){
+gboolean xywnd_size_allocate( ui::Widget widget, GtkAllocation* allocation, XYWnd* xywnd ){
        xywnd->m_nWidth = allocation->width;
        xywnd->m_nHeight = allocation->height;
        xywnd->updateProjection();
@@ -805,7 +810,7 @@ gboolean xywnd_size_allocate( GtkWidget* widget, GtkAllocation* allocation, XYWn
        return FALSE;
 }
 
-gboolean xywnd_expose( GtkWidget* widget, GdkEventExpose* event, XYWnd* xywnd ){
+gboolean xywnd_expose( ui::Widget widget, GdkEventExpose* event, XYWnd* xywnd ){
        if ( glwidget_make_current( xywnd->GetWidget() ) != FALSE ) {
                if ( Map_Valid( g_map ) && ScreenUpdates_Enabled() ) {
                        GlobalOpenGL_debugAssertNoErrors();
@@ -829,9 +834,9 @@ void XYWnd_CameraMoved( XYWnd& xywnd ){
 
 XYWnd::XYWnd() :
        m_gl_widget( glwidget_new( FALSE ) ),
-       m_deferredDraw( WidgetQueueDrawCaller( *m_gl_widget ) ),
+       m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ),
        m_deferred_motion( xywnd_motion, this ),
-       m_parent( 0 ),
+       m_parent( ui::null ),
        m_window_observer( NewWindowObserver() ),
        m_XORRectangle( m_gl_widget ),
        m_chasemouse_handler( 0 ){
@@ -860,36 +865,36 @@ XYWnd::XYWnd() :
 
        m_entityCreate = false;
 
-       m_mnuDrop = 0;
+       m_mnuDrop = ui::Menu(ui::null);
 
        GlobalWindowObservers_add( m_window_observer );
        GlobalWindowObservers_connectWidget( m_gl_widget );
 
-       m_window_observer->setRectangleDrawCallback( ReferenceCaller1<XYWnd, rect_t, xy_update_xor_rectangle>( *this ) );
+       m_window_observer->setRectangleDrawCallback( ReferenceCaller<XYWnd, void(rect_t), xy_update_xor_rectangle>( *this ) );
        m_window_observer->setView( m_view );
 
-       gtk_widget_ref( m_gl_widget );
+       g_object_ref( m_gl_widget._handle );
 
        gtk_widget_set_events( m_gl_widget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK );
-       GTK_WIDGET_SET_FLAGS( m_gl_widget, GTK_CAN_FOCUS );
+       gtk_widget_set_can_focus( m_gl_widget, true );
 
-       m_sizeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "size_allocate", G_CALLBACK( xywnd_size_allocate ), this );
-       m_exposeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "expose_event", G_CALLBACK( xywnd_expose ), this );
+       m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( xywnd_size_allocate ), this );
+       m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( xywnd_expose ), this );
 
-       g_signal_connect( G_OBJECT( m_gl_widget ), "button_press_event", G_CALLBACK( xywnd_button_press ), this );
-       g_signal_connect( G_OBJECT( m_gl_widget ), "button_release_event", G_CALLBACK( xywnd_button_release ), this );
-       g_signal_connect( G_OBJECT( m_gl_widget ), "focus_in_event", G_CALLBACK( xywnd_focus_in ), this );      //works only in floating views layout
-       g_signal_connect( G_OBJECT( m_gl_widget ), "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion );
+       m_gl_widget.connect( "button_press_event", G_CALLBACK( xywnd_button_press ), this );
+       m_gl_widget.connect( "button_release_event", G_CALLBACK( xywnd_button_release ), this );
+       m_gl_widget.connect( "focus_in_event", G_CALLBACK( xywnd_focus_in ), this );    //works only in floating views layout
+       m_gl_widget.connect( "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &m_deferred_motion );
 
-       g_signal_connect( G_OBJECT( m_gl_widget ), "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this );
+       m_gl_widget.connect( "scroll_event", G_CALLBACK( xywnd_wheel_scroll ), this );
 
        Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) );
 
        updateProjection();
        updateModelview();
 
-       AddSceneChangeCallback( ReferenceCaller<XYWnd, &XYWnd_Update>( *this ) );
-       AddCameraMovedCallback( ReferenceCaller<XYWnd, &XYWnd_CameraMoved>( *this ) );
+       AddSceneChangeCallback( ReferenceCaller<XYWnd, void(), &XYWnd_Update>( *this ) );
+       AddCameraMovedCallback( ReferenceCaller<XYWnd, void(), &XYWnd_CameraMoved>( *this ) );
 
        PressedButtons_connect( g_pressedButtons, m_gl_widget );
 
@@ -899,15 +904,15 @@ XYWnd::XYWnd() :
 XYWnd::~XYWnd(){
        onDestroyed();
 
-       if ( m_mnuDrop != 0 ) {
-               gtk_widget_destroy( GTK_WIDGET( m_mnuDrop ) );
-               m_mnuDrop = 0;
+       if ( m_mnuDrop ) {
+               m_mnuDrop.destroy();
+               m_mnuDrop = ui::Menu(ui::null);
        }
 
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_sizeHandler );
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_exposeHandler );
 
-       gtk_widget_unref( m_gl_widget );
+       m_gl_widget.unref();
 
        m_window_observer->release();
 }
@@ -995,7 +1000,7 @@ void XYWnd::Clipper_Crosshair_OnMouseMoved( int x, int y ){
                        GdkCursor *cursor;
                        cursor = gdk_cursor_new( GDK_CROSSHAIR );
                        //cursor = gdk_cursor_new( GDK_FLEUR );
-                       gdk_window_set_cursor( m_gl_widget->window, cursor );
+                       gdk_window_set_cursor( gtk_widget_get_window(m_gl_widget), cursor );
                        gdk_cursor_unref( cursor );
                }
                else{
@@ -1004,14 +1009,14 @@ void XYWnd::Clipper_Crosshair_OnMouseMoved( int x, int y ){
 //                     GdkPixbuf* pixbuf = pixbuf_new_from_file_with_mask( "bitmaps/icon.png" );
 //                     cursor = gdk_cursor_new_from_pixbuf( gdk_display_get_default(), pixbuf, 0, 0 );
 //                     g_object_unref( pixbuf );
-                       gdk_window_set_cursor( m_gl_widget->window, cursor );
+                       gdk_window_set_cursor( gtk_widget_get_window(m_gl_widget), cursor );
                        gdk_cursor_unref( cursor );
 
                }
        }
        else
        {
-               gdk_window_set_cursor( m_gl_widget->window, 0 );
+               gdk_window_set_cursor( gtk_widget_get_window(m_gl_widget), 0 );
        }
 }
 
@@ -1164,15 +1169,15 @@ void XYWnd::NewBrushDrag( int x, int y ){
                                                                "textures/common/caulk" : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ) );
 }
 
-void entitycreate_activated( GtkWidget* item ){
+void entitycreate_activated( ui::Widget item ){
        scene::Node* world_node = Map_FindWorldspawn( g_map );
-       const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( item )->child ) );
+       const char* entity_name = gtk_label_get_text( GTK_LABEL( gtk_bin_get_child(GTK_BIN( item )) ) );
 
        if ( !( world_node && string_equal( entity_name, "worldspawn" ) ) ) {
                g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name );
        }
        else {
-               GlobalRadiant().m_pfnMessageBox( GTK_WIDGET( MainFrame_getWindow() ), "There's already a worldspawn in your map!"
+               GlobalRadiant().m_pfnMessageBox( MainFrame_getWindow(), "There's already a worldspawn in your map!"
                                                                                                                                                          "",
                                                                                 "Info",
                                                                                 eMB_OK,
@@ -1180,21 +1185,21 @@ void entitycreate_activated( GtkWidget* item ){
        }
 }
 
-void EntityClassMenu_addItem( GtkMenu* menu, const char* name ){
-       GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name ) );
-       g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( entitycreate_activated ), item );
-       gtk_widget_show( GTK_WIDGET( item ) );
+void EntityClassMenu_addItem( ui::Menu menu, const char* name ){
+       auto item = ui::MenuItem( name );
+       item.connect( "activate", G_CALLBACK( entitycreate_activated ), item );
+       item.show();
        menu_add_item( menu, item );
 }
 
 class EntityClassMenuInserter : public EntityClassVisitor
 {
-typedef std::pair<GtkMenu*, CopiedString> MenuPair;
+typedef std::pair<ui::Menu, CopiedString> MenuPair;
 typedef std::vector<MenuPair> MenuStack;
 MenuStack m_stack;
 CopiedString m_previous;
 public:
-EntityClassMenuInserter( GtkMenu* menu ){
+EntityClassMenuInserter( ui::Menu menu ){
        m_stack.reserve( 2 );
        m_stack.push_back( MenuPair( menu, "" ) );
 }
@@ -1211,12 +1216,12 @@ void visit( EntityClass* e ){
        m_previous = e->name();
 }
 void pushMenu( const CopiedString& name ){
-       GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name.c_str() ) );
-       gtk_widget_show( GTK_WIDGET( item ) );
-       container_add_widget( GTK_CONTAINER( m_stack.back().first ), GTK_WIDGET( item ) );
+       auto item = ui::MenuItem( name.c_str() );
+       item.show();
+       m_stack.back().first.add(item);
 
-       GtkMenu* submenu = GTK_MENU( gtk_menu_new() );
-       gtk_menu_item_set_submenu( item, GTK_WIDGET( submenu ) );
+       auto submenu = ui::Menu(ui::New);
+       gtk_menu_item_set_submenu( item, submenu  );
 
        m_stack.push_back( MenuPair( submenu, name ) );
 }
@@ -1257,8 +1262,8 @@ void XYWnd::OnContextMenu(){
 //             return;
 //     }
 
-       if ( m_mnuDrop == 0 ) { // first time, load it up
-               GtkMenu* menu = m_mnuDrop = GTK_MENU( gtk_menu_new() );
+       if ( !m_mnuDrop ) { // first time, load it up
+               auto menu = m_mnuDrop = ui::Menu(ui::New);
 
                EntityClassMenuInserter inserter( menu );
                GlobalEntityClassManager().forEach( inserter );
@@ -1278,7 +1283,7 @@ void XYWnd_moveDelta( int x, int y, unsigned int state, void* data ){
        reinterpret_cast<XYWnd*>( data )->Scroll( -x, y );
 }
 
-gboolean XYWnd_Move_focusOut( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){
+gboolean XYWnd_Move_focusOut( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){
        xywnd->Move_End();
        return FALSE;
 }
@@ -1288,13 +1293,13 @@ void XYWnd::Move_Begin(){
                Move_End();
        }
        m_move_started = true;
-       g_xywnd_freezePointer.freeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), m_gl_widget, XYWnd_moveDelta, this );
-       m_move_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this );
+       g_xywnd_freezePointer.freeze_pointer( m_parent  ? m_parent : MainFrame_getWindow(), m_gl_widget, XYWnd_moveDelta, this );
+       m_move_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Move_focusOut ), this );
 }
 
 void XYWnd::Move_End(){
        m_move_started = false;
-       g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), false );
+       g_xywnd_freezePointer.unfreeze_pointer( m_parent ? m_parent : MainFrame_getWindow(), false );
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_move_focusOut );
 }
 
@@ -1329,7 +1334,7 @@ void XYWnd_zoomDelta( int x, int y, unsigned int state, void* data ){
        }
 }
 
-gboolean XYWnd_Zoom_focusOut( GtkWidget* widget, GdkEventFocus* event, XYWnd* xywnd ){
+gboolean XYWnd_Zoom_focusOut( ui::Widget widget, GdkEventFocus* event, XYWnd* xywnd ){
        xywnd->Zoom_End();
        return FALSE;
 }
@@ -1342,13 +1347,13 @@ void XYWnd::Zoom_Begin( int x, int y ){
        g_dragZoom = 0;
        g_zoom2x = x;
        g_zoom2y = y;
-       g_xywnd_freezePointer.freeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), m_gl_widget, XYWnd_zoomDelta, this );
-       m_zoom_focusOut = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this );
+       g_xywnd_freezePointer.freeze_pointer( m_parent ? m_parent : MainFrame_getWindow(), m_gl_widget, XYWnd_zoomDelta, this );
+       m_zoom_focusOut = m_gl_widget.connect( "focus_out_event", G_CALLBACK( XYWnd_Zoom_focusOut ), this );
 }
 
 void XYWnd::Zoom_End(){
        m_zoom_started = false;
-       g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), false );
+       g_xywnd_freezePointer.unfreeze_pointer( m_parent ? m_parent : MainFrame_getWindow(), false );
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_zoom_focusOut );
 }
 
@@ -1369,7 +1374,7 @@ void XYWnd::SetViewType( VIEWTYPE viewType ){
        m_viewType = viewType;
        updateModelview();
 
-       if ( m_parent != 0 ) {
+       if ( m_parent ) {
                gtk_window_set_title( m_parent, ViewType_getTitle( m_viewType ) );
        }
 }
@@ -1487,7 +1492,7 @@ void XYWnd::XY_MouseMoved( int x, int y, unsigned int buttons ){
                           << "  z:: " << FloatFormat( m_mousePosition[2], 6, 1 );
                g_pParentWnd->SetStatusText( g_pParentWnd->m_position_status, status.c_str() );
 
-               if ( g_bCrossHairs ) {
+               if ( g_xywindow_globals_private.g_bCrossHairs ) {
                        XYWnd_Update( *this );
                }
 
@@ -1615,12 +1620,12 @@ void XYWnd::XY_DisableBackground( void ){
 void WXY_BackgroundSelect( void ){
        bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
        if ( !brushesSelected ) {
-               gtk_MessageBox( 0, "You have to select some brushes to get the bounding box for.\n",
-                                               "No selection", eMB_OK, eMB_ICONERROR );
+               ui::alert( ui::root, "You have to select some brushes to get the bounding box for.\n",
+                                               "No selection", ui::alert_type::OK, ui::alert_icon::Error );
                return;
        }
 
-       const char *filename = file_dialog( GTK_WIDGET( MainFrame_getWindow() ), TRUE, "Background Image", NULL, NULL );
+       const char *filename = MainFrame_getWindow().file_dialog( TRUE, "Background Image", NULL, NULL );
        g_pParentWnd->ActiveXY()->XY_DisableBackground();
        if ( filename ) {
                g_pParentWnd->ActiveXY()->XY_LoadBackgroundImage( filename );
@@ -2363,7 +2368,7 @@ void SetState( Shader* state, EStyle style ){
                m_state_stack.back().m_state = state;
        }
 }
-const EStyle getStyle() const {
+EStyle getStyle() const {
        return eWireframeOnly;
 }
 void PushState(){
@@ -2590,7 +2595,7 @@ void XYWnd::XY_Draw(){
                PaintSizeInfo( nDim1, nDim2, min, max );
        }
 
-       if ( g_bCrossHairs ) {
+       if ( g_xywindow_globals_private.g_bCrossHairs ) {
                glColor4f( 0.2f, 0.9f, 0.2f, 0.8f );
                glBegin( GL_LINES );
                if ( m_viewType == XY ) {
@@ -2811,22 +2816,37 @@ void XY_ZoomOut(){
 
 
 
+void ToggleShowCrosshair(){
+       g_xywindow_globals_private.g_bCrossHairs ^= 1;
+       XY_UpdateAllWindows();
+}
+
+void ToggleShowSizeInfo(){
+       g_xywindow_globals_private.m_bSizePaint = !g_xywindow_globals_private.m_bSizePaint;
+       XY_UpdateAllWindows();
+}
+
+void ToggleShowGrid(){
+       g_xywindow_globals_private.d_showgrid = !g_xywindow_globals_private.d_showgrid;
+       XY_UpdateAllWindows();
+}
+
 ToggleShown g_xy_top_shown( true );
 
-void XY_Top_Shown_Construct( GtkWindow* parent ){
-       g_xy_top_shown.connect( GTK_WIDGET( parent ) );
+void XY_Top_Shown_Construct( ui::Window parent ){
+       g_xy_top_shown.connect( parent );
 }
 
 ToggleShown g_yz_side_shown( false );
 
-void YZ_Side_Shown_Construct( GtkWindow* parent ){
-       g_yz_side_shown.connect( GTK_WIDGET( parent ) );
+void YZ_Side_Shown_Construct( ui::Window parent ){
+       g_yz_side_shown.connect( parent );
 }
 
 ToggleShown g_xz_front_shown( false );
 
-void XZ_Front_Shown_Construct( GtkWindow* parent ){
-       g_xz_front_shown.connect( GTK_WIDGET( parent ) );
+void XZ_Front_Shown_Construct( ui::Window parent ){
+       g_xz_front_shown.connect( parent );
 }
 
 
@@ -2842,9 +2862,9 @@ void realise(){
 }
 void unrealise(){
        if ( ++m_unrealised == 1 ) {
-               if ( XYWnd::m_mnuDrop != 0 ) {
-                       gtk_widget_destroy( GTK_WIDGET( XYWnd::m_mnuDrop ) );
-                       XYWnd::m_mnuDrop = 0;
+               if ( XYWnd::m_mnuDrop ) {
+                       XYWnd::m_mnuDrop.destroy();
+                       XYWnd::m_mnuDrop = ui::Menu(ui::null);
                }
        }
 }
@@ -2853,100 +2873,114 @@ void unrealise(){
 EntityClassMenu g_EntityClassMenu;
 
 
-
-
-void ShowNamesExport( const BoolImportCallback& importer ){
-       importer( GlobalEntityCreator().getShowNames() );
-}
-typedef FreeCaller1<const BoolImportCallback&, ShowNamesExport> ShowNamesExportCaller;
-ShowNamesExportCaller g_show_names_caller;
-ToggleItem g_show_names( g_show_names_caller );
+// Names
 void ShowNamesToggle(){
        GlobalEntityCreator().setShowNames( !GlobalEntityCreator().getShowNames() );
-       g_show_names.update();
        XY_UpdateAllWindows();
 }
 
-void ShowTargetNamesExport( const BoolImportCallback& importer ){
-       importer( GlobalEntityCreator().getShowTargetNames() );
+typedef FreeCaller<void(), ShowNamesToggle> ShowNamesToggleCaller;
+
+void ShowNamesExport( const Callback<void(bool)> & importer ){
+       importer( GlobalEntityCreator().getShowNames() );
 }
-typedef FreeCaller1<const BoolImportCallback&, ShowTargetNamesExport> ShowTargetNamesExportCaller;
-ShowTargetNamesExportCaller g_show_targetnames_caller;
-ToggleItem g_show_targetnames( g_show_targetnames_caller );
+
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowNamesExport> ShowNamesExportCaller;
+
+// TargetNames
 void ShowTargetNamesToggle(){
        GlobalEntityCreator().setShowTargetNames( !GlobalEntityCreator().getShowTargetNames() );
-       g_show_targetnames.update();
        XY_UpdateAllWindows();
 }
 
-void ShowAnglesExport( const BoolImportCallback& importer ){
-       importer( GlobalEntityCreator().getShowAngles() );
+typedef FreeCaller<void(), ShowTargetNamesToggle> ShowTargetNamesToggleCaller;
+
+void ShowTargetNamesExport( const Callback<void(bool)> & importer ){
+       importer( GlobalEntityCreator().getShowTargetNames() );
 }
-typedef FreeCaller1<const BoolImportCallback&, ShowAnglesExport> ShowAnglesExportCaller;
-ShowAnglesExportCaller g_show_angles_caller;
-ToggleItem g_show_angles( g_show_angles_caller );
+
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowTargetNamesExport> ShowTargetNamesExportCaller;
+
+// Angles
 void ShowAnglesToggle(){
        GlobalEntityCreator().setShowAngles( !GlobalEntityCreator().getShowAngles() );
-       g_show_angles.update();
        XY_UpdateAllWindows();
 }
 
-BoolExportCaller g_show_blocks_caller( g_xywindow_globals_private.show_blocks );
-ToggleItem g_show_blocks( g_show_blocks_caller );
+typedef FreeCaller<void(), ShowAnglesToggle> ShowAnglesToggleCaller;
+
+void ShowAnglesExport( const Callback<void(bool)> & importer ){
+       importer( GlobalEntityCreator().getShowAngles() );
+}
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowAnglesExport> ShowAnglesExportCaller;
+
+// Blocks
 void ShowBlocksToggle(){
        g_xywindow_globals_private.show_blocks ^= 1;
-       g_show_blocks.update();
        XY_UpdateAllWindows();
 }
 
-BoolExportCaller g_show_coordinates_caller( g_xywindow_globals_private.show_coordinates );
-ToggleItem g_show_coordinates( g_show_coordinates_caller );
+typedef FreeCaller<void(), ShowBlocksToggle> ShowBlocksToggleCaller;
+
+void ShowBlocksExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.show_blocks );
+}
+
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowBlocksExport> ShowBlocksExportCaller;
+
+// Coordinates
 void ShowCoordinatesToggle(){
        g_xywindow_globals_private.show_coordinates ^= 1;
-       g_show_coordinates.update();
        XY_UpdateAllWindows();
 }
 
-BoolExportCaller g_show_outline_caller( g_xywindow_globals_private.show_outline );
-ToggleItem g_show_outline( g_show_outline_caller );
+typedef FreeCaller<void(), ShowCoordinatesToggle> ShowCoordinatesToggleCaller;
+
+void ShowCoordinatesExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.show_coordinates );
+}
+
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowCoordinatesExport> ShowCoordinatesExportCaller;
+
+// Outlines
 void ShowOutlineToggle(){
        g_xywindow_globals_private.show_outline ^= 1;
-       g_show_outline.update();
        XY_UpdateAllWindows();
 }
 
-BoolExportCaller g_show_axes_caller( g_xywindow_globals_private.show_axis );
-ToggleItem g_show_axes( g_show_axes_caller );
+typedef FreeCaller<void(), ShowOutlineToggle> ShowOutlineToggleCaller;
+
+void ShowOutlineExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.show_outline );
+}
+
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowOutlineExport> ShowOutlineExportCaller;
+
+// Axes
 void ShowAxesToggle(){
        g_xywindow_globals_private.show_axis ^= 1;
-       g_show_axes.update();
        XY_UpdateAllWindows();
 }
+typedef FreeCaller<void(), ShowAxesToggle> ShowAxesToggleCaller;
+
+void ShowAxesExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.show_axis );
+}
 
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowAxesExport> ShowAxesExportCaller;
 
-BoolExportCaller g_show_workzone_caller( g_xywindow_globals_private.d_show_work );
-ToggleItem g_show_workzone( g_show_workzone_caller );
+// Workzone
 void ShowWorkzoneToggle(){
        g_xywindow_globals_private.d_show_work ^= 1;
-       g_show_workzone.update();
        XY_UpdateAllWindows();
 }
+typedef FreeCaller<void(), ShowWorkzoneToggle> ShowWorkzoneToggleCaller;
 
-/*
-void ShowAxesToggle(){
-       g_xywindow_globals_private.show_axis ^= 1;
-       XY_UpdateAllWindows();
+void ShowWorkzoneExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.d_show_work );
 }
-typedef FreeCaller<ShowAxesToggle> ShowAxesToggleCaller;
-void ShowAxesExport( const BoolImportCallback& importer ){
-       importer( g_xywindow_globals_private.show_axis );
-}
-typedef FreeCaller1<const BoolImportCallback&, ShowAxesExport> ShowAxesExportCaller;
 
-ShowAxesExportCaller g_show_axes_caller;
-BoolExportCallback g_show_axes_callback( g_show_axes_caller );
-ToggleItem g_show_axes( g_show_axes_callback );
-*/
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowWorkzoneExport> ShowWorkzoneExportCaller;
 
 /*
 BoolExportCaller g_texdef_movelock_caller( g_brush_texturelock_enabled );
@@ -2958,44 +2992,98 @@ void Texdef_ToggleMoveLock(){
 }
 */
 
-BoolExportCaller g_show_size_caller( g_xywindow_globals_private.m_bSizePaint );
-ToggleItem g_show_size_item( g_show_size_caller );
-void ToggleShowSizeInfo(){
+// Size
+void ShowSizeToggle(){
        g_xywindow_globals_private.m_bSizePaint = !g_xywindow_globals_private.m_bSizePaint;
-       g_show_size_item.update();
        XY_UpdateAllWindows();
 }
+typedef FreeCaller<void(), ShowSizeToggle> ShowSizeToggleCaller;
+void ShowSizeExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.m_bSizePaint );
+}
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowSizeExport> ShowSizeExportCaller;
 
-BoolExportCaller g_show_crosshair_caller( g_bCrossHairs );
-ToggleItem g_show_crosshair_item( g_show_crosshair_caller );
-void ToggleShowCrosshair(){
-       g_bCrossHairs ^= 1;
-       g_show_crosshair_item.update();
+// Crosshair
+void ShowCrosshairToggle(){
+       g_xywindow_globals_private.g_bCrossHairs ^= 1;
        XY_UpdateAllWindows();
 }
+typedef FreeCaller<void(), ShowCrosshairToggle> ShowCrosshairToggleCaller;
+void ShowCrosshairExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.g_bCrossHairs );
+}
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowCrosshairExport> ShowCrosshairExportCaller;
 
-BoolExportCaller g_show_grid_caller( g_xywindow_globals_private.d_showgrid );
-ToggleItem g_show_grid_item( g_show_grid_caller );
-void ToggleShowGrid(){
+// Grid
+void ShowGridToggle(){
        g_xywindow_globals_private.d_showgrid = !g_xywindow_globals_private.d_showgrid;
-       g_show_grid_item.update();
        XY_UpdateAllWindows();
 }
+typedef FreeCaller<void(), ShowGridToggle> ShowGridToggleCaller;
+void ShowGridTExport( const Callback<void(bool)> & importer ){
+       importer( g_xywindow_globals_private.d_showgrid );
+}
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowSizeExport> ShowGridExportCaller;
+
+
+ShowNamesExportCaller g_show_names_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_names_callback( g_show_names_caller );
+ToggleItem g_show_names( g_show_names_callback );
+
+ShowTargetNamesExportCaller g_show_targetnames_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_targetnames_callback( g_show_targetnames_caller );
+ToggleItem g_show_targetnames( g_show_targetnames_callback );
+
+ShowAnglesExportCaller g_show_angles_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_angles_callback( g_show_angles_caller );
+ToggleItem g_show_angles( g_show_angles_callback );
+
+ShowBlocksExportCaller g_show_blocks_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_blocks_callback( g_show_blocks_caller );
+ToggleItem g_show_blocks( g_show_blocks_callback );
+
+ShowCoordinatesExportCaller g_show_coordinates_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_coordinates_callback( g_show_coordinates_caller );
+ToggleItem g_show_coordinates( g_show_coordinates_callback );
+
+ShowOutlineExportCaller g_show_outline_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_outline_callback( g_show_outline_caller );
+ToggleItem g_show_outline( g_show_outline_callback );
+
+ShowAxesExportCaller g_show_axes_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_axes_callback( g_show_axes_caller );
+ToggleItem g_show_axes( g_show_axes_callback );
+
+ShowWorkzoneExportCaller g_show_workzone_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_workzone_callback( g_show_workzone_caller );
+ToggleItem g_show_workzone( g_show_workzone_callback );
+
+ShowSizeExportCaller g_show_size_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_size_callback( g_show_size_caller );
+ToggleItem g_show_size( g_show_size_callback );
+
+ShowCrosshairExportCaller g_show_crosshair_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_crosshair_callback( g_show_crosshair_caller );
+ToggleItem g_show_crosshair( g_show_crosshair_callback );
+
+ShowGridExportCaller g_show_grid_caller;
+Callback<void(const Callback<void(bool)> &)> g_show_grid_callback( g_show_grid_caller );
+ToggleItem g_show_grid( g_show_grid_callback );
 
 
 void XYShow_registerCommands(){
-       GlobalToggles_insert( "ToggleSizePaint", FreeCaller<ToggleShowSizeInfo>(), ToggleItem::AddCallbackCaller( g_show_size_item ), Accelerator( 'J' ) );
-       GlobalToggles_insert( "ToggleCrosshairs", FreeCaller<ToggleShowCrosshair>(), ToggleItem::AddCallbackCaller( g_show_crosshair_item ), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) );
-       GlobalToggles_insert( "ToggleGrid", FreeCaller<ToggleShowGrid>(), ToggleItem::AddCallbackCaller( g_show_grid_item ), Accelerator( '0' ) );
+       GlobalToggles_insert( "ToggleSizePaint", ShowSizeToggleCaller(), ToggleItem::AddCallbackCaller( g_show_size ), Accelerator( 'J' ) );
+       GlobalToggles_insert( "ToggleCrosshairs", ShowCrosshairToggleCaller(), ToggleItem::AddCallbackCaller( g_show_crosshair ), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) );
+       GlobalToggles_insert( "ToggleGrid", ShowGridToggleCaller(), ToggleItem::AddCallbackCaller( g_show_grid ), Accelerator( '0' ) );
 
-       GlobalToggles_insert( "ShowAngles", FreeCaller<ShowAnglesToggle>(), ToggleItem::AddCallbackCaller( g_show_angles ) );
-       GlobalToggles_insert( "ShowNames", FreeCaller<ShowNamesToggle>(), ToggleItem::AddCallbackCaller( g_show_names ) );
-       GlobalToggles_insert( "ShowTargetNames", FreeCaller<ShowTargetNamesToggle>(), ToggleItem::AddCallbackCaller( g_show_targetnames ) );
-       GlobalToggles_insert( "ShowBlocks", FreeCaller<ShowBlocksToggle>(), ToggleItem::AddCallbackCaller( g_show_blocks ) );
-       GlobalToggles_insert( "ShowCoordinates", FreeCaller<ShowCoordinatesToggle>(), ToggleItem::AddCallbackCaller( g_show_coordinates ) );
-       GlobalToggles_insert( "ShowWindowOutline", FreeCaller<ShowOutlineToggle>(), ToggleItem::AddCallbackCaller( g_show_outline ) );
-       GlobalToggles_insert( "ShowAxes", FreeCaller<ShowAxesToggle>(), ToggleItem::AddCallbackCaller( g_show_axes ) );
-       GlobalToggles_insert( "ShowWorkzone", FreeCaller<ShowWorkzoneToggle>(), ToggleItem::AddCallbackCaller( g_show_workzone ) );
+       GlobalToggles_insert( "ShowAngles", ShowAnglesToggleCaller(), ToggleItem::AddCallbackCaller( g_show_angles ) );
+       GlobalToggles_insert( "ShowNames", ShowNamesToggleCaller(), ToggleItem::AddCallbackCaller( g_show_names ) );
+       GlobalToggles_insert( "ShowTargetNames", ShowTargetNamesToggleCaller(), ToggleItem::AddCallbackCaller( g_show_targetnames ) );
+       GlobalToggles_insert( "ShowBlocks", ShowBlocksToggleCaller(), ToggleItem::AddCallbackCaller( g_show_blocks ) );
+       GlobalToggles_insert( "ShowCoordinates", ShowCoordinatesToggleCaller(), ToggleItem::AddCallbackCaller( g_show_coordinates ) );
+       GlobalToggles_insert( "ShowWindowOutline", ShowOutlineToggleCaller(), ToggleItem::AddCallbackCaller( g_show_outline ) );
+       GlobalToggles_insert( "ShowAxes", ShowAxesToggleCaller(), ToggleItem::AddCallbackCaller( g_show_axes ) );
+       GlobalToggles_insert( "ShowWorkzone", ShowWorkzoneToggleCaller(), ToggleItem::AddCallbackCaller( g_show_workzone ) );
 }
 
 void XYWnd_registerShortcuts(){
@@ -3017,7 +3105,7 @@ void Orthographic_constructPage( PreferenceGroup& group ){
        Orthographic_constructPreferences( page );
 }
 void Orthographic_registerPreferencesPage(){
-       PreferencesDialog_addSettingsPage( FreeCaller1<PreferenceGroup&, Orthographic_constructPage>() );
+       PreferencesDialog_addSettingsPage( makeCallbackF(Orthographic_constructPage) );
 }
 
 void Clipper_constructPreferences( PreferencesPage& page ){
@@ -3028,7 +3116,7 @@ void Clipper_constructPage( PreferenceGroup& group ){
        Clipper_constructPreferences( page );
 }
 void Clipper_registerPreferencesPage(){
-       PreferencesDialog_addSettingsPage( FreeCaller1<PreferenceGroup&, Clipper_constructPage>() );
+       PreferencesDialog_addSettingsPage( makeCallbackF(Clipper_constructPage) );
 }
 
 
@@ -3036,65 +3124,66 @@ void Clipper_registerPreferencesPage(){
 #include "stringio.h"
 
 
+struct ToggleShown_Bool {
+       static void Export(const ToggleShown &self, const Callback<void(bool)> &returnz) {
+               returnz(self.active());
+       }
 
-
-void ToggleShown_importBool( ToggleShown& self, bool value ){
-       self.set( value );
-}
-typedef ReferenceCaller1<ToggleShown, bool, ToggleShown_importBool> ToggleShownImportBoolCaller;
-void ToggleShown_exportBool( const ToggleShown& self, const BoolImportCallback& importer ){
-       importer( self.active() );
-}
-typedef ConstReferenceCaller1<ToggleShown, const BoolImportCallback&, ToggleShown_exportBool> ToggleShownExportBoolCaller;
+       static void Import(ToggleShown &self, bool value) {
+               self.set(value);
+       }
+};
 
 
 void XYWindow_Construct(){
-//     GlobalCommands_insert( "ToggleCrosshairs", FreeCaller<ToggleShowCrosshair>(), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) );
-//     GlobalCommands_insert( "ToggleSizePaint", FreeCaller<ToggleShowSizeInfo>(), Accelerator( 'J' ) );
-//     GlobalCommands_insert( "ToggleGrid", FreeCaller<ToggleShowGrid>(), Accelerator( '0' ) );
+//     GlobalCommands_insert( "ToggleCrosshairs", makeCallbackF(ToggleShowCrosshair), Accelerator( 'X', (GdkModifierType)GDK_SHIFT_MASK ) );
+//     GlobalCommands_insert( "ToggleSizePaint", makeCallbackF(ToggleShowSizeInfo), Accelerator( 'J' ) );
+//     GlobalCommands_insert( "ToggleGrid", makeCallbackF(ToggleShowGrid), Accelerator( '0' ) );
 
        GlobalToggles_insert( "ToggleView", ToggleShown::ToggleCaller( g_xy_top_shown ), ToggleItem::AddCallbackCaller( g_xy_top_shown.m_item ), Accelerator( 'V', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
        GlobalToggles_insert( "ToggleSideView", ToggleShown::ToggleCaller( g_yz_side_shown ), ToggleItem::AddCallbackCaller( g_yz_side_shown.m_item ) );
        GlobalToggles_insert( "ToggleFrontView", ToggleShown::ToggleCaller( g_xz_front_shown ), ToggleItem::AddCallbackCaller( g_xz_front_shown.m_item ) );
-       GlobalCommands_insert( "NextView", FreeCaller<XY_Next>(), Accelerator( GDK_Tab, (GdkModifierType)GDK_CONTROL_MASK ) );
-       GlobalCommands_insert( "ZoomIn", FreeCaller<XY_ZoomIn>(), Accelerator( GDK_Delete ) );
-       GlobalCommands_insert( "ZoomOut", FreeCaller<XY_ZoomOut>(), Accelerator( GDK_Insert ) );
-       GlobalCommands_insert( "ViewTop", FreeCaller<XY_Top>(), Accelerator( GDK_KP_Home ) );
-       GlobalCommands_insert( "ViewSide", FreeCaller<XY_Side>(), Accelerator( GDK_KP_Page_Down ) );
-       GlobalCommands_insert( "ViewFront", FreeCaller<XY_Front>(), Accelerator( GDK_KP_End ) );
-       GlobalCommands_insert( "Zoom100", FreeCaller<XY_Zoom100>() );
-       GlobalCommands_insert( "CenterXYView", FreeCaller<XY_Focus>(), Accelerator( GDK_Tab, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
-
-       GlobalPreferenceSystem().registerPreference( "ClipCaulk", BoolImportStringCaller( g_clip_useCaulk ), BoolExportStringCaller( g_clip_useCaulk ) );
-
-//     GlobalPreferenceSystem().registerPreference( "NewRightClick", BoolImportStringCaller( g_xywindow_globals.m_bRightClick ), BoolExportStringCaller( g_xywindow_globals.m_bRightClick ) );
-       GlobalPreferenceSystem().registerPreference( "2DZoomInToPointer", BoolImportStringCaller( g_xywindow_globals.m_bZoomInToPointer ), BoolExportStringCaller( g_xywindow_globals.m_bZoomInToPointer ) );
-       GlobalPreferenceSystem().registerPreference( "ChaseMouse", BoolImportStringCaller( g_xywindow_globals_private.m_bChaseMouse ), BoolExportStringCaller( g_xywindow_globals_private.m_bChaseMouse ) );
-       GlobalPreferenceSystem().registerPreference( "SizePainting", BoolImportStringCaller( g_xywindow_globals_private.m_bSizePaint ), BoolExportStringCaller( g_xywindow_globals_private.m_bSizePaint ) );
-       GlobalPreferenceSystem().registerPreference( "ShowCrosshair", BoolImportStringCaller( g_bCrossHairs ), BoolExportStringCaller( g_bCrossHairs ) );
-       GlobalPreferenceSystem().registerPreference( "NoStipple", BoolImportStringCaller( g_xywindow_globals.m_bNoStipple ), BoolExportStringCaller( g_xywindow_globals.m_bNoStipple ) );
-       GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", BoolImportStringCaller( g_xywindow_globals_private.show_coordinates ), BoolExportStringCaller( g_xywindow_globals_private.show_coordinates ) );
-       GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", BoolImportStringCaller( g_xywindow_globals_private.show_outline ), BoolExportStringCaller( g_xywindow_globals_private.show_outline ) );
-       GlobalPreferenceSystem().registerPreference( "SI_ShowAxis", BoolImportStringCaller( g_xywindow_globals_private.show_axis ), BoolExportStringCaller( g_xywindow_globals_private.show_axis ) );
-//     GlobalPreferenceSystem().registerPreference( "CamXYUpdate", BoolImportStringCaller( g_xywindow_globals_private.m_bCamXYUpdate ), BoolExportStringCaller( g_xywindow_globals_private.m_bCamXYUpdate ) );
-       GlobalPreferenceSystem().registerPreference( "ShowWorkzone", BoolImportStringCaller( g_xywindow_globals_private.d_show_work ), BoolExportStringCaller( g_xywindow_globals_private.d_show_work ) );
-
-       GlobalPreferenceSystem().registerPreference( "SI_AxisColors0", Vector3ImportStringCaller( g_xywindow_globals.AxisColorX ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorX ) );
-       GlobalPreferenceSystem().registerPreference( "SI_AxisColors1", Vector3ImportStringCaller( g_xywindow_globals.AxisColorY ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorY ) );
-       GlobalPreferenceSystem().registerPreference( "SI_AxisColors2", Vector3ImportStringCaller( g_xywindow_globals.AxisColorZ ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorZ ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors1", Vector3ImportStringCaller( g_xywindow_globals.color_gridback ), Vector3ExportStringCaller( g_xywindow_globals.color_gridback ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors2", Vector3ImportStringCaller( g_xywindow_globals.color_gridminor ), Vector3ExportStringCaller( g_xywindow_globals.color_gridminor ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors3", Vector3ImportStringCaller( g_xywindow_globals.color_gridmajor ), Vector3ExportStringCaller( g_xywindow_globals.color_gridmajor ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors6", Vector3ImportStringCaller( g_xywindow_globals.color_gridblock ), Vector3ExportStringCaller( g_xywindow_globals.color_gridblock ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors7", Vector3ImportStringCaller( g_xywindow_globals.color_gridtext ), Vector3ExportStringCaller( g_xywindow_globals.color_gridtext ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors8", Vector3ImportStringCaller( g_xywindow_globals.color_brushes ), Vector3ExportStringCaller( g_xywindow_globals.color_brushes ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors9", Vector3ImportStringCaller( g_xywindow_globals.color_viewname ), Vector3ExportStringCaller( g_xywindow_globals.color_viewname ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors10", Vector3ImportStringCaller( g_xywindow_globals.color_clipper ), Vector3ExportStringCaller( g_xywindow_globals.color_clipper ) );
-       GlobalPreferenceSystem().registerPreference( "SI_Colors11", Vector3ImportStringCaller( g_xywindow_globals.color_selbrushes ), Vector3ExportStringCaller( g_xywindow_globals.color_selbrushes ) );
-
-
-       GlobalPreferenceSystem().registerPreference( "XZVIS", makeBoolStringImportCallback( ToggleShownImportBoolCaller( g_xz_front_shown ) ), makeBoolStringExportCallback( ToggleShownExportBoolCaller( g_xz_front_shown ) ) );
-       GlobalPreferenceSystem().registerPreference( "YZVIS", makeBoolStringImportCallback( ToggleShownImportBoolCaller( g_yz_side_shown ) ), makeBoolStringExportCallback( ToggleShownExportBoolCaller( g_yz_side_shown ) ) );
+       GlobalCommands_insert( "NextView", makeCallbackF(XY_Next), Accelerator( GDK_KEY_Tab, (GdkModifierType)GDK_CONTROL_MASK ) ); // fixme: doesn't show its shortcut
+       GlobalCommands_insert( "ZoomIn", makeCallbackF(XY_ZoomIn), Accelerator( GDK_KEY_Delete ) );
+       GlobalCommands_insert( "ZoomOut", makeCallbackF(XY_ZoomOut), Accelerator( GDK_KEY_Insert ) );
+       GlobalCommands_insert( "ViewTop", makeCallbackF(XY_Top), Accelerator( GDK_KEY_KP_Home ) );
+       GlobalCommands_insert( "ViewSide", makeCallbackF(XY_Side), Accelerator( GDK_KEY_KP_Page_Down ) );
+       GlobalCommands_insert( "ViewFront", makeCallbackF(XY_Front), Accelerator( GDK_KEY_KP_End ) );
+       GlobalCommands_insert( "Zoom100", makeCallbackF(XY_Zoom100) );
+       GlobalCommands_insert( "CenterXYView", makeCallbackF(XY_Focus), Accelerator( GDK_KEY_Tab, (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) );
+
+       GlobalPreferenceSystem().registerPreference( "ClipCaulk", make_property_string( g_clip_useCaulk ) );
+
+//     GlobalPreferenceSystem().registerPreference( "NewRightClick", make_property_string( g_xywindow_globals.m_bRightClick ) );
+       GlobalPreferenceSystem().registerPreference( "2DZoomInToPointer", make_property_string( g_xywindow_globals.m_bZoomInToPointer ) );
+       GlobalPreferenceSystem().registerPreference( "ChaseMouse", make_property_string( g_xywindow_globals_private.m_bChaseMouse ) );
+       GlobalPreferenceSystem().registerPreference( "SizePainting", make_property_string( g_xywindow_globals_private.m_bSizePaint ) );
+       GlobalPreferenceSystem().registerPreference( "ShowCrosshair", make_property_string( g_xywindow_globals_private.g_bCrossHairs ) );
+       GlobalPreferenceSystem().registerPreference( "NoStipple", make_property_string( g_xywindow_globals.m_bNoStipple ) );
+       GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", make_property_string( g_xywindow_globals_private.show_coordinates ) );
+       GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", make_property_string( g_xywindow_globals_private.show_outline ) );
+       GlobalPreferenceSystem().registerPreference( "SI_ShowAxis", make_property_string( g_xywindow_globals_private.show_axis ) );
+//     GlobalPreferenceSystem().registerPreference( "CamXYUpdate", make_property_string( g_xywindow_globals_private.m_bCamXYUpdate ) );
+       GlobalPreferenceSystem().registerPreference( "ShowWorkzone", make_property_string( g_xywindow_globals_private.d_show_work ) );
+
+       GlobalPreferenceSystem().registerPreference( "SI_AxisColors0", make_property_string( g_xywindow_globals.AxisColorX ) );
+       GlobalPreferenceSystem().registerPreference( "SI_AxisColors1", make_property_string( g_xywindow_globals.AxisColorY ) );
+       GlobalPreferenceSystem().registerPreference( "SI_AxisColors2", make_property_string( g_xywindow_globals.AxisColorZ ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors1", make_property_string( g_xywindow_globals.color_gridback ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors2", make_property_string( g_xywindow_globals.color_gridminor ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors3", make_property_string( g_xywindow_globals.color_gridmajor ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors6", make_property_string( g_xywindow_globals.color_gridblock ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors7", make_property_string( g_xywindow_globals.color_gridtext ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors8", make_property_string( g_xywindow_globals.color_brushes ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors9", make_property_string( g_xywindow_globals.color_viewname ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors10", make_property_string( g_xywindow_globals.color_clipper ) );
+       GlobalPreferenceSystem().registerPreference( "SI_Colors11", make_property_string( g_xywindow_globals.color_selbrushes ) );
+
+
+
+
+       GlobalPreferenceSystem().registerPreference( "XZVIS", make_property_string<ToggleShown_Bool>( g_xz_front_shown ) );
+       GlobalPreferenceSystem().registerPreference( "YZVIS", make_property_string<ToggleShown_Bool>( g_yz_side_shown ) );
 
        Orthographic_registerPreferencesPage();
        Clipper_registerPreferencesPage();