 TUPLE: gtk-clipboard handle ;
 
 C: <gtk-clipboard> gtk-clipboard
+
+PIXEL-FORMAT-ATTRIBUTE-TABLE: gl-config-attribs { $[ GDK_GL_USE_GL enum>number GDK_GL_RGBA enum>number ] } H{
+    { double-buffered { $[ GDK_GL_DOUBLEBUFFER enum>number ] } }
+    { stereo { $[ GDK_GL_STEREO enum>number ] } }
+    ! { offscreen { $[ GDK_GL_DRAWABLE_TYPE enum>number ] 2 } }
+    ! { fullscreen { $[ GDK_GL_DRAWABLE_TYPE enum>number ] 1 } }
+    ! { windowed { $[ GDK_GL_DRAWABLE_TYPE enum>number ] 1 } }
+    { color-bits { $[ GDK_GL_BUFFER_SIZE enum>number ] } }
+    { red-bits { $[ GDK_GL_RED_SIZE enum>number ] } }
+    { green-bits { $[ GDK_GL_GREEN_SIZE enum>number ] } }
+    { blue-bits { $[ GDK_GL_BLUE_SIZE enum>number ] } }
+    { alpha-bits { $[ GDK_GL_ALPHA_SIZE enum>number ] } }
+    { accum-red-bits { $[ GDK_GL_ACCUM_RED_SIZE enum>number ] } }
+    { accum-green-bits { $[ GDK_GL_ACCUM_GREEN_SIZE enum>number ] } }
+    { accum-blue-bits { $[ GDK_GL_ACCUM_BLUE_SIZE enum>number ] } }
+    { accum-alpha-bits { $[ GDK_GL_ACCUM_ALPHA_SIZE enum>number ] } }
+    { depth-bits { $[ GDK_GL_DEPTH_SIZE enum>number ] } }
+    { stencil-bits { $[ GDK_GL_STENCIL_SIZE enum>number ] } }
+    { aux-buffers { $[ GDK_GL_AUX_BUFFERS enum>number ] } }
+    { sample-buffers { $[ GDK_GL_SAMPLE_BUFFERS enum>number ] } }
+    { samples { $[ GDK_GL_SAMPLES enum>number ] } }
+}
+
+M: gtk-ui-backend (make-pixel-format)
+    nip >gl-config-attribs-int-array gdk_gl_config_new ;
+
+M: gtk-ui-backend (free-pixel-format)
+    handle>> g_object_unref ;
+
+M: gtk-ui-backend (pixel-format-attribute)
+    [ handle>> ] [ >gl-config-attribs ] bi*
+    { int } [ gdk_gl_config_get_attrib drop ] [ ]
+    with-out-parameters ;
 
 CONSTANT: events-mask
     {

    win "delete-event" [ on-delete ]
    GtkWidget:delete-event connect-signal ;

: enable-gl ( win -- ? )
    ${
        GDK_GL_MODE_RGBA
        GDK_GL_MODE_DOUBLE
        GDK_GL_MODE_DEPTH
        GDK_GL_MODE_STENCIL
        GDK_GL_MODE_ALPHA
    } [ enum>number ] [ bitor ] map-reduce
    gdk_gl_config_new_by_mode
    f t GDK_GL_RGBA_TYPE enum>number gtk_widget_set_gl_capability ;

CONSTANT: window-controls>decor-flags
    H{
        { close-button 0 }

        GDK_FUNC_MOVE enum>number bitor gdk_window_set_functions
    ] 2tri ;

: setup-gl ( world -- ? )
    [
        [ handle>> window>> ] [ handle>> ] bi*
        f t GDK_GL_RGBA_TYPE enum>number gtk_widget_set_gl_capability
    ] with-world-pixel-format ;

M:: gtk-ui-backend (open-window) ( world -- )
    GTK_WINDOW_TOPLEVEL gtk_window_new :> win
    win <window-handle> world handle<<
    world [ window-loc>> win swap first2 gtk_window_move ]
    [ dim>> win swap first2 gtk_window_set_default_size ] bi

    world setup-gl drop
    
    win connect-signals
    
    win gtk_widget_realize
    win world window-controls>> configure-window-controls
    
    world win register-window
    
    win gtk_widget_show_all ;
