The problem was that gtk2hs does not support gtk3, and the file I was creating was for gtk3.
Glade can generate either a libglade file or gtkbuilder file. Both are xml files, and the main difference between them is that the first starts with <glade-interface>
and the later starts with <interface>
. Also in gtkbuilder files the <object>
tag is used instead of the <widget>
tag.
The Graphics.UI.Gtk.Glade
package makes use of the libglade files, and the problem is that these are obsolete and deprecated.
At the Glade download page there are two versions available. The newer of them generates gtkbuilders meant to be used with gtk3, but since gtk2hs does not support gtk3, you'll have to download version 3.8, which generates both libglade and gtkbuilder files for gtk2.
The best thing to do is to stop using libglade files and use the gtkbuilder files instead. To do this you must import Graphics.UI.Gtk.Builder
instead of Graphics.UI.Gtk.Glade
I found this tutorial which makes use of gtkbuilder instead of libglade.
This program creates a window with a button, and every time you click the button you'll get a "hello world" on your terminal until the window is closed.
import Graphics.UI.Gtk
import Graphics.UI.Gtk.Builder
main = do
initGUI
builder <- builderNew
builderAddFromFile builder "windowbuilder.glade"
mainWindow <- builderGetObject builder castToWindow "main_window"
onDestroy mainWindow mainQuit
helloWorldButton <- builderGetObject builder castToButton "hello_world_button"
onClicked helloWorldButton (putStrLn "Hello, World!")
widgetShowAll mainWindow
mainGUI
This is pulling the gui from the windowbuilder.glade file. I created that file using glade-3. Here it is.
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="main_window">
<property name="width_request">210</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">This is a window</property>
<property name="resizable">False</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Click the button!!</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="hello_world_button">
<property name="label">gtk-ok</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="border_width">7</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="padding">5</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Another good reason to switch to gtkbuilder files is that the haskell glade package won't compile with ghc >= 7.6.