<div>Hi Andy,</div><div><br></div>Your program didn&#39;t compile as given, so I cut out some of the event handling fanciness you were doing. Also, my modified version restarts whenever the &#39;r&#39; key is pressed. I figure those changes aren&#39;t important to the problem at hand.<div>
<br></div><div>Anyway, I don&#39;t think it&#39;s ever going to be possible to define a Binary instance for a TextView, since all of the functions which can yield information about it are impure. I would recommend extracting the relevant data beforehand, and then persisting it in a tuple. You could use some &#39;marshal&lt;WIDGET&gt;&#39; and &#39;recreate&lt;WIDGET&gt;&#39; functions if you need to persist many different widget types. Saving just the text can be done as follows:</div>
<div><br></div><div>&lt;code&gt;</div><div>module DyreExample where</div><div><br></div><div>import Graphics.UI.Gtk hiding (get)</div><div>import qualified Graphics.UI.Gtk.Gdk.Events as E</div><div><br></div><div>import qualified Config.Dyre as Dyre</div>
<div>import Config.Dyre.Relaunch</div><div><br></div><div>import System.IO</div><div>import Data.Binary</div><div><br></div><div>data Config = Config { message :: String, errorMsg :: Maybe String }</div><div><br></div><div>
defaultConfig :: Config</div><div>defaultConfig = Config &quot;Dyre Example v0.1&quot; Nothing</div><div><br></div><div>showError :: Config -&gt; String -&gt; Config</div><div>showError cfg msg = cfg { errorMsg = Just msg }</div>
<div><br></div><div>realMain Config{message = message, errorMsg = errorMsg } = do</div><div>  initGUI</div><div><br></div><div>  textView &lt;- textViewNew</div><div>  textBuffer &lt;- textViewGetBuffer textView</div><div>
  text &lt;- restoreBinaryState &quot;&quot;</div><div>  putStrLn $ &quot;Restored state: &quot; ++ text</div><div>  textBufferSetText textBuffer text</div><div><br></div><div>  rootWindow &lt;- windowNew</div><div>  rootWindow `onDestroy` mainQuit</div>
<div>  windowFullscreen rootWindow</div><div><br></div><div>  rootWindow `containerAdd` textView</div><div><br></div><div>  widgetShowAll rootWindow</div><div><br></div><div>  rootWindow `onKeyPress` (\event -&gt; dyreKeyTest event textView)</div>
<div><br></div><div>  mainGUI</div><div><br></div><div>dyreExample = Dyre.wrapMain $ Dyre.defaultParams</div><div>    { Dyre.projectName = &quot;Main&quot;</div><div>    , Dyre.realMain    = realMain</div><div>    , Dyre.showError   = showError</div>
<div>    }</div><div><br></div><div>dyreKeyTest :: E.Event -&gt; TextView -&gt; IO Bool</div><div>dyreKeyTest ev textView = do</div><div>    case E.eventKeyName ev of</div><div>         &quot;r&quot; -&gt; do textBuffer &lt;- textViewGetBuffer textView</div>
<div>                   sI &lt;- textBufferGetStartIter textBuffer</div><div>                   eI &lt;- textBufferGetEndIter textBuffer</div><div>                   text &lt;- textBufferGetText textBuffer sI eI True</div>
<div>                   putStrLn $ &quot;Relaunching with state: &quot; ++ text</div><div>                   relaunchWithBinaryState text Nothing</div><div>                   return True</div><div>         _   -&gt; return False</div>
<div>&lt;/code&gt;</div><div><br></div><div>Other comments:</div><div>  1. It isn&#39;t necessary to explicitly tell Dyre to do a custom compile. It will take care of figuring that out once you restart it.</div><div>  2. Instead of manually setting paths in the code, you can use the &#39;--dyre-debug&#39; command-line flag, which will cause Dyre to look for configurations in the current directory, and store temporary files in a &#39;cache&#39; subdirectory.</div>
<div>  3. Giving a project name of &#39;Main&#39; causes Dyre to see the file &#39;Main.hs&#39; as a custom configuration. I&#39;m not sure if that&#39;s what you intended, but it will make testing custom configurations harder than it needs to be.</div>
<div>  4. Good luck with the rest of your project!</div><div><br></div><div>- Will Donnelly</div>