Hello. This is OpenBSD4.9, but I believe latest Leafpad still has this
problem.
$ pkg_info leafpadInformation for inst:leafpad-0.8.17p4

Sometimes Undo currupted document, and this was shown in xterm.
> (leafpad:5025): GLib-GObject-WARNING **: gsignal.c:2354: handler `238' of
instance `0x7df450d8' is not blocked> (leafpad:5025): GLib-GObject-WARNING **:
gsignal.c:2354: handler `239' of instance `0x7df450d8' is not blocked
The cause of problem was,
   1. When user modifies text, cb_begin_user_action() will be called.      It
unlocks signal handler which stores record of modification into      undo
buffer. This signal handler is disabled usually because there      is
modification should not go into undo buffer. (ie: undo itself)
   2. While unlock faze, another cb_begin_user_action() can be called.    
 (I'm not sure, but it's natural to think so)      But this time, glib's
internal lock count is already 0, so that      warning was shown.
   3. Inner cb_end_user_action() increses lock count to 1.
   4. Outer cb_end_user_action() increses lock count to 2. (!)
Now, next cb_begin_user_action() cannot unlock signal handler, becauselock
count is 2 not 1. So undo buffer management
corrupts.gtk_text_buffer_begin_user_action() will avoid this, because ittreats
another *user action* count internally, 
# I don't think so, but maybe other g_signal_emit_by_name also# should be
replaced by similar functions.
Workaround is "leafpad-undo.patch". I'm not sure this is real fix.
<not worked>--sync option (Make X calls synchronous) didn't solve undo
problem. :-(</not worked>
/////////////////////////////////////////////////////////////////
leafpad-undo.patch
=== modified file 'indent.c'--- indent.c        2011-05-08 09:13:10 +0000+++ 
indent.c
2011-05-08 09:25:28 +0000@@ -69,13 +69,13 @@            GtkTextBuffer *buffer =
gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));     -
g_signal_emit_by_name(G_OBJECT(buffer), "begin-user-action");+
gtk_text_buffer_begin_user_action(buffer); 
gtk_text_buffer_delete_selection(buffer, TRUE, TRUE); 
gtk_text_buffer_get_iter_at_mark(buffer, &iter,
gtk_text_buffer_get_insert(buffer));    ind = compute_indentation(buffer, &iter,
gtk_text_iter_get_line(&iter));         str = g_strconcat("\n", ind, NULL); 
gtk_text_buffer_insert(buffer, &iter, str, -1);-
g_signal_emit_by_name(G_OBJECT(buffer), "end-user-action");+
gtk_text_buffer_end_user_action(buffer);        g_free(str);    g_free(ind);    
@@
-149,9 +149,9 @@        for (i = start_line; i < end_line; i++) { 
gtk_text_buffer_get_iter_at_line(buffer, &iter, i); 
gtk_text_buffer_place_cursor(buffer, &iter);-
g_signal_emit_by_name(G_OBJECT(buffer), "begin-user-action");+
gtk_text_buffer_begin_user_action(buffer);              
gtk_text_buffer_insert(buffer,
&iter, "\t", 1);-               g_signal_emit_by_name(G_OBJECT(buffer),
"end-user-action");+            gtk_text_buffer_end_user_action(buffer); 
undo_set_sequency(TRUE);        }       undo_set_sequency(FALSE);@@ -201,9 
+201,9 @@ 
end_iter = start_iter;                  gtk_text_iter_forward_chars(&end_iter, 
len); 
gtk_text_buffer_move_mark_by_name(buffer, "insert", &end_iter);-
g_signal_emit_by_name(G_OBJECT(buffer), "begin-user-action");+
gtk_text_buffer_begin_user_action(buffer);                      
gtk_text_buffer_delete(buffer,
&start_iter, &end_iter);-                       
g_signal_emit_by_name(G_OBJECT(buffer),
"end-user-action");+                    
gtk_text_buffer_end_user_action(buffer); 
undo_set_sequency(TRUE);                        g_free(ind);            }
=== modified file 'search.c'--- search.c        2011-05-08 09:13:10 +0000+++ 
search.c
2011-05-08 09:25:28 +0000@@ -218,12 +218,10 @@ 
gtk_text_buffer_get_insert(textbuffer));                                offset =
gtk_text_iter_get_offset(&rep_start);                           
undo_set_sequency(TRUE);-
g_signal_emit_by_name(G_OBJECT(textbuffer),-                                    
"begin-user-action");+
gtk_text_buffer_begin_user_action(textbuffer); 
gtk_text_buffer_insert_at_cursor(textbuffer,                                    
string_replace,
strlen(string_replace));-                               
g_signal_emit_by_name(G_OBJECT(textbuffer),-
"end-user-action");+                            
gtk_text_buffer_end_user_action(textbuffer); 
gtk_text_buffer_get_iter_at_mark(                                       
textbuffer, &iter, 
gtk_text_buffer_get_insert(textbuffer));

[demime 1.01d removed an attachment of type text/x-patch]

Reply via email to