Hi everyone.
Just a follow-up:
I have even changed the code to not use the iterator passed into
the bufferInsertText signal handler:
idRef <- newIORef undefined
buf <- textViewGetBuffer txtViewCmd
id <- buf `on` bufferInsertText $ (handleCmdInsertText idRef buf)
writeIORef idRef id
handleCmdInsertText :: IORef (ConnectId TextBuffer) -> TextBuffer ->
TextIter -> String -> IO ()
handleCmdInsertText idRef buf _ _ = do
id <- readIORef idRef
signalBlock id
iter2 <- textBufferGetEndIter buf
textBufferInsert buf iter2 "&"
signalUnblock id
return ()
I have read up and it seems that all iterators for a given text buffer is
invalidated as soon as I modify the textBuffer in my signal handler.
How does one work around this. This seems to be a bug in gtk2hs?
Regards
==========================================
I am trying to write code that when the user enters a " (double-quote) into a
TextView, I catch this event and I want to add another
" (double-quote) char as the closing double-quote char. However, I get the
following error message:
(main.exe:4100): Gtk-WARNING **: Invalid text buffer iterator: either the
iterator is uninitialized, or the characters/pixbufs/widgets in the buffer have
been modified since the iterator was created.
You must use marks, character numbers, or line numbers to preserve a position
across buffer modifications.
You can apply tags and insert marks without invalidating your iterators,
but any mutation that affects 'indexable' buffer contents (contents that can
be referred to by character offset)
will invalidate all outstanding iterators.
I am using a very recent version of the gtk2hs darcs repo and GHC 7.2.2 and GTK
2.24.8 on windows 7. I am still learning
the GTK way of ding things so it might also be that I am using iterators
incorrectly. If so, can someone just point me in the
right direction here.
Here is some sample Haskell code:
-- hooks up the bufferInsertText signal handler
idRef <- newIORef undefined
buf <- textViewGetBuffer txtViewCmd
id <- buf `on` bufferInsertText $ (handleCmdInsertText idRef)
writeIORef idRef id
-- event handler function
handleCmdInsertText :: IORef (ConnectId TextBuffer) -> TextIter -> String
-> IO ()
handleCmdInsertText idRef iter str = do
id <- readIORef idRef
signalBlock id
if str == "\""
then do
isAdjacent <-insertMarkerIsAdjacentToText iter
if not isAdjacent
then do buf <- textIterGetBuffer iter
textBufferInsert buf iter "\""
else return ()
else return ()
signalUnblock id
return ()
-- helper function for handleCmdInsertText event handler
insertMarkerIsAdjacentToText :: TextIter -> IO Bool
insertMarkerIsAdjacentToText currentIter = do
charToLeft <- textIterCopy currentIter >>= \iter -> do{
textIterBackwardChar iter; c <- textIterGetChar iter; return c; }
charToRight <- textIterCopy currentIter >>= \iter -> do{
textIterForwardChar iter; c <- textIterGetChar iter; return c; }
return $! (maybe False (/= ' ') charToLeft) || (maybe False (/= ' ')
charToRight)
Kind regards
Rouan
------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Gtk2hs-devel mailing list
Gtk2hs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtk2hs-devel