diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,12 @@
 
+0.1.2
+-----
+
+Bug fixes:
+ * Exceptions triggered during an attempt to save to an invalid path no
+   longer cause a crash and are now reported to the user (#4)
+ * Canvas size dialog fields are now clickable (#5)
+
 0.1.1
 -----
 
diff --git a/programs/App.hs b/programs/App.hs
--- a/programs/App.hs
+++ b/programs/App.hs
@@ -91,6 +91,7 @@
                       , _canvasPath              = fp
                       , _canvasDirty             = False
                       , _askToSaveFilenameEdit   = editor AskToSaveFilenameEdit (Just 1) ""
+                      , _saveError               = Nothing
                       , _appEventChannel         = chan
                       , _textEntered             = mempty
                       , _textEntryStart          = (0, 0)
diff --git a/programs/Events/AskForSaveFilename.hs b/programs/Events/AskForSaveFilename.hs
--- a/programs/Events/AskForSaveFilename.hs
+++ b/programs/Events/AskForSaveFilename.hs
@@ -22,7 +22,7 @@
         then if isQuitting then halt s else continue $ popMode s
         else let s' = s & canvasPath .~ Just (T.unpack fn)
              in if isQuitting
-                then quit False s'
+                then quit False (popMode s')
                 else continue =<< (popMode <$> saveAndContinue s')
 handleAskForSaveFilenameEvent _ s (VtyEvent e) =
     continue =<< handleEventLensed s askToSaveFilenameEdit handleEditorEvent e
diff --git a/programs/Events/CanvasSizePrompt.hs b/programs/Events/CanvasSizePrompt.hs
--- a/programs/Events/CanvasSizePrompt.hs
+++ b/programs/Events/CanvasSizePrompt.hs
@@ -14,6 +14,12 @@
 import State
 
 handleCanvasSizePromptEvent :: AppState -> BrickEvent Name e -> EventM Name (Next AppState)
+handleCanvasSizePromptEvent s (MouseDown CanvasSizeWidthEdit _ _ _) =
+    continue $ s & canvasSizeFocus %~ focusSetCurrent CanvasSizeWidthEdit
+handleCanvasSizePromptEvent s (MouseDown CanvasSizeHeightEdit _ _ _) =
+    continue $ s & canvasSizeFocus %~ focusSetCurrent CanvasSizeHeightEdit
+handleCanvasSizePromptEvent s (MouseDown _ _ _ _) =
+    continue $ popMode s
 handleCanvasSizePromptEvent s (VtyEvent (V.EvKey (V.KChar '\t') [])) =
     continue $ s & canvasSizeFocus %~ focusNext
 handleCanvasSizePromptEvent s (VtyEvent (V.EvKey V.KBackTab [])) =
diff --git a/programs/State.hs b/programs/State.hs
--- a/programs/State.hs
+++ b/programs/State.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE RankNTypes #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TupleSections #-}
+{-# LANGUAGE ScopedTypeVariables #-}
 module State
   ( checkForMouseSupport
   , setTool
@@ -78,6 +79,7 @@
 
 import Control.Monad (when, forM, forM_)
 import Control.Monad.Trans (liftIO)
+import qualified Control.Exception as E
 import Data.Monoid ((<>))
 import qualified Graphics.Vty as V
 import qualified Data.Vector as Vec
@@ -369,8 +371,12 @@
                     if ask
                     then continue $ askToSave s
                     else do
-                        liftIO $ saveToDisk s p
-                        halt s
+                        result <- liftIO $ E.try $ saveToDisk s p
+                        case result of
+                            Left (e::E.SomeException) ->
+                                continue $ askForSaveFilename True $
+                                    s & saveError .~ (Just $ T.pack $ show e)
+                            Right () -> halt s
         False -> halt s
 
 saveToDisk :: AppState -> FilePath -> IO ()
@@ -382,9 +388,10 @@
 saveAndContinue :: AppState -> EventM Name AppState
 saveAndContinue s = do
     case s^.canvasPath of
-        Nothing -> return ()
-        Just p -> liftIO $ saveToDisk s p
-    return $ s & canvasDirty .~ False
+        Nothing -> return s
+        Just p -> do
+            liftIO $ saveToDisk s p
+            return $ s & canvasDirty .~ False
 
 writeCanvasFiles :: FilePath -> [Canvas] -> [Int] -> [String] -> IO ()
 writeCanvasFiles path cs order names = do
diff --git a/programs/Theme.hs b/programs/Theme.hs
--- a/programs/Theme.hs
+++ b/programs/Theme.hs
@@ -5,6 +5,7 @@
   , keybindingAttr
   , selectedLayerAttr
   , clickableAttr
+  , errorAttr
   )
 where
 
@@ -21,6 +22,9 @@
 clickableAttr :: AttrName
 clickableAttr = "clickable"
 
+errorAttr :: AttrName
+errorAttr = "error"
+
 theme :: AttrMap
 theme = attrMap defAttr
   [ (keybindingAttr,        fg white `withStyle` underline)
@@ -28,4 +32,5 @@
   , (editFocusedAttr,       black `on` yellow)
   , (selectedLayerAttr,     white `on` magenta)
   , (clickableAttr,         fg white `withStyle` bold)
+  , (errorAttr,             fg red)
   ]
diff --git a/programs/Types.hs b/programs/Types.hs
--- a/programs/Types.hs
+++ b/programs/Types.hs
@@ -63,6 +63,7 @@
   , undoStack
   , redoStack
   , drawStyle
+  , saveError
   )
 where
 
@@ -233,6 +234,7 @@
              , _canvasPath              :: Maybe FilePath
              , _canvasDirty             :: Bool
              , _askToSaveFilenameEdit   :: Editor T.Text Name
+             , _saveError               :: Maybe T.Text
              , _appEventChannel         :: BChan AppEvent
              , _textEntered             :: [(Char, V.Attr)]
              , _textEntryStart          :: (Int, Int)
diff --git a/programs/UI/AskForSaveFilename.hs b/programs/UI/AskForSaveFilename.hs
--- a/programs/UI/AskForSaveFilename.hs
+++ b/programs/UI/AskForSaveFilename.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE OverloadedStrings #-}
 module UI.AskForSaveFilename
   ( drawAskForSaveFilenameUI
   )
@@ -37,8 +38,13 @@
                             , withDefAttr keybindingAttr $ str "Esc"
                             , str " to cancel)"
                             ]
-        body = (hCenter $ str "Save changes to:") <=>
+        body = maybeError <=>
+               (hCenter $ str "Save changes to:") <=>
                (hCenter help) <=>
                padTopBottom 1 fn
+        maybeError = maybe emptyWidget mkSaveError (s^.saveError)
+        mkSaveError msg = withDefAttr errorAttr $
+                          (hCenter $ txt "Error saving:") <=>
+                          (padBottom (Pad 1) $ txtWrap msg)
         renderString = txt . T.unlines
         fn = str "Path: " <+> renderEditor renderString True (s^.askToSaveFilenameEdit)
diff --git a/programs/UI/CanvasSizePrompt.hs b/programs/UI/CanvasSizePrompt.hs
--- a/programs/UI/CanvasSizePrompt.hs
+++ b/programs/UI/CanvasSizePrompt.hs
@@ -26,7 +26,9 @@
     where
         body = padBottom (Pad 1) width <=> height
         renderString = txt . T.unlines
-        width = str "Width: "  <+> withFocusRing (s^.canvasSizeFocus)
-            (renderEditor renderString) (s^.canvasSizeWidthEdit)
-        height = str "Height: " <+> withFocusRing (s^.canvasSizeFocus)
-            (renderEditor renderString) (s^.canvasSizeHeightEdit)
+        width = str "Width: "  <+>
+                (clickable CanvasSizeWidthEdit $
+                 withFocusRing (s^.canvasSizeFocus) (renderEditor renderString) (s^.canvasSizeWidthEdit))
+        height = str "Height: " <+>
+                (clickable CanvasSizeHeightEdit $
+                 withFocusRing (s^.canvasSizeFocus) (renderEditor renderString) (s^.canvasSizeHeightEdit))
diff --git a/tart.cabal b/tart.cabal
--- a/tart.cabal
+++ b/tart.cabal
@@ -1,5 +1,5 @@
 name:                tart
-version:             0.1.1
+version:             0.1.2
 synopsis:            Terminal Art
 description:         A program to make ASCII art
 license:             BSD3
@@ -77,7 +77,7 @@
                        Draw.Box
   default-language:    Haskell2010
   build-depends:       base >=4.9 && < 5,
-                       brick >= 0.24,
+                       brick >= 0.30,
                        vty >= 5.17,
                        vector,
                        microlens-platform,
