Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: third_party/undoview/undo_manager.c

Issue 4683002: Update internal state on undo to avoid a crash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address James' comments. Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence 2 * Copyright (C) 1998, 1999 Alex Roberts, Evan Lawrence
3 * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi 3 * Copyright (C) 2000, 2001 Chema Celorio, Paolo Maggi
4 * Copyright (C) 2002-2005 Paolo Maggi 4 * Copyright (C) 2002-2005 Paolo Maggi
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public 7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version. 9 * version 2.1 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 * from the action list (freeing the list or resizing it) */ 111 * from the action list (freeing the list or resizing it) */
112 GtkSourceUndoAction *modified_action; 112 GtkSourceUndoAction *modified_action;
113 }; 113 };
114 114
115 enum { 115 enum {
116 CAN_UNDO, 116 CAN_UNDO,
117 CAN_REDO, 117 CAN_REDO,
118 LAST_SIGNAL 118 LAST_SIGNAL
119 }; 119 };
120 120
121 #if !defined(NDEBUG)
122 static void
123 print_state(GtkSourceUndoManager* um)
124 {
125 fprintf(stderr, "\n***\n");
126 GList* actions = um->priv->actions;
127
128 for (; actions; actions = g_list_next(actions)) {
129 GtkSourceUndoAction* act = actions->data;
130 fprintf(stderr, "* type = %s\n", act->action_type == GTK_SOURCE_UNDO_ACTION_ DELETE ?
131 "delete" : "insert");
132
133 fprintf(stderr, "\ttext = %s\n", act->action_type == GTK_SOURCE_UNDO_ACTION_ DELETE
134 ? act->action.delete.text : act->action.insert.text);
135 fprintf(stderr, "\torder = %d\n", act->order_in_group);
136 }
137
138 fprintf(stderr, "* next redo: %d\n", um->priv->next_redo);
139 fprintf(stderr, "* num of groups: %d\n", um->priv->num_of_groups);
140 fprintf(stderr, "* actions in group: %d\n", um->priv->actions_in_current_group );
141 }
142 #endif
143
121 static void gtk_source_undo_manager_class_init(GtkSourceUndoManagerClass *klass) ; 144 static void gtk_source_undo_manager_class_init(GtkSourceUndoManagerClass *klass) ;
122 static void gtk_source_undo_manager_init(GtkSourceUndoManager *um); 145 static void gtk_source_undo_manager_init(GtkSourceUndoManager *um);
123 static void gtk_source_undo_manager_finalize(GObject *object); 146 static void gtk_source_undo_manager_finalize(GObject *object);
124 147
125 static void gtk_source_undo_manager_insert_text_handler(GtkTextBuffer *buffer, 148 static void gtk_source_undo_manager_insert_text_handler(GtkTextBuffer *buffer,
126 GtkTextIter *pos, 149 GtkTextIter *pos,
127 const gchar *text, 150 const gchar *text,
128 gint length, 151 gint length,
129 GtkSourceUndoManager *um); 152 GtkSourceUndoManager *um);
130 static void gtk_source_undo_manager_delete_range_handler(GtkTextBuffer *buffer, 153 static void gtk_source_undo_manager_delete_range_handler(GtkTextBuffer *buffer,
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 GList *l; 640 GList *l;
618 641
619 l = um->priv->actions; 642 l = um->priv->actions;
620 643
621 while(l != NULL) 644 while(l != NULL)
622 { 645 {
623 GtkSourceUndoAction *action = l->data; 646 GtkSourceUndoAction *action = l->data;
624 647
625 if(action->order_in_group == 1) 648 if(action->order_in_group == 1)
626 --um->priv->num_of_groups; 649 --um->priv->num_of_groups;
650 um->priv->actions_in_current_group = action->order_in_group - 1;
627 651
628 if(action->modified) 652 if(action->modified)
629 um->priv->modified_action = INVALID; 653 um->priv->modified_action = INVALID;
630 654
631 gtk_source_undo_action_free(action); 655 gtk_source_undo_action_free(action);
632 656
633 l = g_list_next(l); 657 l = g_list_next(l);
634 } 658 }
635 659
636 g_list_free(um->priv->actions); 660 g_list_free(um->priv->actions);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 804
781 if(um->priv->actions == NULL) 805 if(um->priv->actions == NULL)
782 return; 806 return;
783 807
784 for(i = 0; i < n; i++) 808 for(i = 0; i < n; i++)
785 { 809 {
786 GtkSourceUndoAction *action = g_list_first(um->priv->actions)->data; 810 GtkSourceUndoAction *action = g_list_first(um->priv->actions)->data;
787 811
788 if(action->order_in_group == 1) 812 if(action->order_in_group == 1)
789 --um->priv->num_of_groups; 813 --um->priv->num_of_groups;
814 um->priv->actions_in_current_group = action->order_in_group - 1;
790 815
791 if(action->modified) 816 if(action->modified)
792 um->priv->modified_action = INVALID; 817 um->priv->modified_action = INVALID;
793 818
794 gtk_source_undo_action_free(action); 819 gtk_source_undo_action_free(action);
795 820
796 um->priv->actions = g_list_delete_link(um->priv->actions, 821 um->priv->actions = g_list_delete_link(um->priv->actions,
797 um->priv->actions); 822 um->priv->actions);
798 823
799 if(um->priv->actions == NULL) 824 if(um->priv->actions == NULL)
(...skipping 20 matching lines...) Expand all
820 845
821 last = g_list_last(um->priv->actions); 846 last = g_list_last(um->priv->actions);
822 undo_action =(GtkSourceUndoAction*) last->data; 847 undo_action =(GtkSourceUndoAction*) last->data;
823 848
824 do 849 do
825 { 850 {
826 GList *tmp; 851 GList *tmp;
827 852
828 if(undo_action->order_in_group == 1) 853 if(undo_action->order_in_group == 1)
829 --um->priv->num_of_groups; 854 --um->priv->num_of_groups;
855 um->priv->actions_in_current_group = undo_action->order_in_group - 1;
830 856
831 if(undo_action->modified) 857 if(undo_action->modified)
832 um->priv->modified_action = INVALID; 858 um->priv->modified_action = INVALID;
833 859
834 gtk_source_undo_action_free(undo_action); 860 gtk_source_undo_action_free(undo_action);
835 861
836 tmp = g_list_previous(last); 862 tmp = g_list_previous(last);
837 um->priv->actions = g_list_delete_link(um->priv->actions, last); 863 um->priv->actions = g_list_delete_link(um->priv->actions, last);
838 last = tmp; 864 last = tmp;
839 g_return_if_fail(last != NULL); 865 g_return_if_fail(last != NULL);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
1075 g_return_if_fail(list != NULL); 1101 g_return_if_fail(list != NULL);
1076 1102
1077 action =(GtkSourceUndoAction*) list->data; 1103 action =(GtkSourceUndoAction*) list->data;
1078 g_return_if_fail(action != NULL); 1104 g_return_if_fail(action != NULL);
1079 } 1105 }
1080 1106
1081 action->modified = TRUE; 1107 action->modified = TRUE;
1082 um->priv->modified_action = action; 1108 um->priv->modified_action = action;
1083 } 1109 }
1084 1110
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698