diff --git a/Sifflet/UI/LittleGtk.hs b/Sifflet/UI/LittleGtk.hs
--- a/Sifflet/UI/LittleGtk.hs
+++ b/Sifflet/UI/LittleGtk.hs
@@ -151,6 +151,7 @@
     , widgetVisible
 
     , Window
+    , windowDeletable
     , windowMove
     , windowNew
     , windowPresent
diff --git a/Sifflet/UI/Window.hs b/Sifflet/UI/Window.hs
--- a/Sifflet/UI/Window.hs
+++ b/Sifflet/UI/Window.hs
@@ -89,10 +89,7 @@
                 ; widgetSetName window ("Sifflet-" ++ winId)
                 ; vwin <- initWin vpui window
                 ; let vpui' = vpuiInsertWindow vpui winId vwin
-                -- when window is destroyed, remove it from the map
-                ; uimgr (OnWindowDestroy window 
-                         (\ uiref ->
-                              modifyIORef uiref (vpuiRemoveVPUIWindow winId)))
+                ; uimgr (OnWindowDestroy window (onWindowDestroy winId))
                 ; return (vpui', vwin, True)
                 }
           Just vw ->
@@ -102,6 +99,16 @@
   ; return (vpui', vw, isNew)
   }
 
+onWindowDestroy :: WinId -> IORef VPUI -> IO ()
+onWindowDestroy winId uiref =
+  if (winId == workspaceId) 
+  then 
+      readIORef uiref >>=
+      checkForChanges "quit (by closing the workspace window)" True False
+                          (\ vpui -> do { mainQuit; return vpui }) >>
+      return ()
+  else modifyIORef uiref (vpuiRemoveVPUIWindow winId)
+
 -- | Default "do-nothing" add-callbacks function
 initCBDefault :: VPUI -> WinId -> CBMgr -> IO ()
 initCBDefault _vpui _winId _uimgr = return ()
@@ -144,7 +151,9 @@
             Nothing -> workspaceNewDefault style (buildMainMenu cbmgr)
             Just func -> workspaceNewEditing style env func
   ; set window [windowTitle := winId, containerChild := wsBox ws]
-
+                -- this should suppress the window close button,
+                -- but doesn't, at least in Fluxbox
+                -- windowDeletable := False] -- no close button
   ; widgetShowAll window
   ; windowPresent window
 
@@ -388,24 +397,27 @@
 -- | Quit from Sifflet
 
 menuFileQuit :: VPUI -> IO VPUI
-menuFileQuit vpui = checkForChanges vpui "quit" False vpuiQuit
+menuFileQuit = checkForChanges "quit" False True vpuiQuit
 
 -- | Open a file (load its function definitions)
 
 menuFileOpen :: CBMgr -> VPUI -> IO VPUI
-menuFileOpen cbmgr vpui =
-    checkForChanges vpui "open file" True (continueFileOpen cbmgr)
+menuFileOpen cbmgr =
+    checkForChanges "open file" True True (continueFileOpen cbmgr)
 
 -- | Offer to save changes, if any, and continue with the continuation.
 -- The continuation gets the current vpui if there are no changes
 -- or if the offer to save is rejected; otherwise, it gets a
 -- vpui which knows it has saved its last changes.
+-- If offerCancel is true, there is an option to cancel the operation;
+-- this won't work if the user is closing the main (workspace) window.
 -- The message, if any, is a confirmation that the file was
 -- saved and that we are going on to the next operation --
 -- useful for open file, but not for quit.
 
-checkForChanges :: VPUI -> String -> Bool -> (VPUI -> IO VPUI) -> IO VPUI
-checkForChanges vpui beforeOperation acknowledge continue =
+checkForChanges :: String -> Bool -> Bool -> (VPUI -> IO VPUI) 
+                -> VPUI -> IO VPUI
+checkForChanges beforeOperation acknowledge offerCancel continue vpui =
     let mAckIfSaved vpui' = 
             when (not (vpuiFileChanged vpui') && acknowledge)
                  (
@@ -416,12 +428,21 @@
                  ) 
             >>
             return vpui'
-        labels = ["Save them", 
-                  "Throw them away", 
-                  "Cancel " ++ beforeOperation]
-        actions = [menuFileSave vpui >>= mAckIfSaved >>= continue, -- save
-                   return vpui >>= continue,                 -- throw away
-                   return vpui]                              -- cancel
+        choices = [("Save them", 
+                    menuFileSave vpui >>= mAckIfSaved >>= continue),
+                   ("Throw them away", 
+                    return vpui >>= continue)] ++ 
+                  if offerCancel
+                  then [("Cancel " ++ beforeOperation, return vpui)]
+                  else []
+        labels = map fst choices
+        actions = map snd choices
+        -- labels = ["Save them", 
+        --           "Throw them away", 
+        --           ]
+        -- actions = [menuFileSave vpui >>= mAckIfSaved >>= continue, -- save
+        --            return vpui >>= continue,                 -- throw away
+        --            return vpui]                              -- cancel
         offerSaveAndContinue = showChoicesDialog "Save changes?"
                         ("There are unsaved changes.  " ++
                           "Before you " ++ beforeOperation ++
diff --git a/sifflet-lib.cabal b/sifflet-lib.cabal
--- a/sifflet-lib.cabal
+++ b/sifflet-lib.cabal
@@ -1,5 +1,5 @@
 name: sifflet-lib
-version: 1.2.1
+version: 1.2.2
 cabal-version: >= 1.8
 build-type: Simple
 license: BSD3
@@ -16,7 +16,8 @@
   tests and its exporters.
 description: Supporting modules for the Sifflet visual, 
   functional programming language (Hackage 'sifflet' package).
-  Version 1.2.1: updated for compatibility with gtk-0.12.
+  Version 1.2.2: Safely quits when main (workspace) window is closed.
+  Version 1.2.1: Updated for compatibility with gtk-0.12.
 category: 
   Language
   , Visual Programming
