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]