Changeset 2a1e37c2ebaa4d166360a8bed2b730ac8cdc8203
- Timestamp:
- 11/09/09 16:46:22 (4 years ago)
- Author:
- Benjamin Herr <ben@…>
- git-author:
- Benjamin Herr <ben@0x539.de> / 2009-11-09T16:11:04Z+0100
- Parents:
- 732c22f27b65ef45c0c1b5142b735804990451ec
- Children:
- 3c40239e8c602c1870208940eaee9b6828b9032c
- git-committer:
- Benjamin Herr <ben@0x539.de> / 2009-11-09T16:46:22Z+0100
- Message:
-
statusbar: fix crash with removing info messages twice
2009-11-09 Benjamin Herr <ben@…>
- code/core/statusbar.cpp:
- code/core/statusbar.hpp: Add hide_message that only removes a
message widget without removing the (then-null) pointer from the
m_list. hide_message can be called multiple times, thus avoiding the
crash when an info message was removed twice.
- Files:
-
Legend:
- Unmodified
- Added
- Removed
-
|
r732c22f
|
r2a1e37c
|
|
| | 1 | 2009-11-09 Benjamin Herr <ben@0x539.de> |
| | 2 | |
| | 3 | * code/core/statusbar.cpp: |
| | 4 | * code/core/statusbar.hpp: Add hide_message that only removes a |
| | 5 | message widget without removing the (then-null) pointer from the |
| | 6 | m_list. hide_message can be called multiple times, thus avoiding the |
| | 7 | crash when an info message was removed twice. |
| | 8 | |
| 1 | 9 | 2009-11-09 Benjamin Herr <ben@0x539.de> |
| 2 | 10 | |
-
|
r732c22f
|
r2a1e37c
|
|
| 63 | 63 | } |
| 64 | 64 | |
| | 65 | bool is_error() { return !m_detail_desc.empty(); } |
| | 66 | |
| 65 | 67 | Gtk::Widget* widget() const { return m_widget; } |
| 66 | 68 | |
| … |
… |
|
| 74 | 76 | const Preferences& preferences): |
| 75 | 77 | Gtk::HBox(false, 2), m_folder(folder), m_preferences(preferences), |
| 76 | | m_current_view(NULL), m_position_context_id(0) |
| | 78 | m_current_view(NULL), m_position_context_id(0), m_visible_messages(0) |
| 77 | 79 | { |
| 78 | 80 | pack_end(m_bar_position, Gtk::PACK_SHRINK); |
| … |
… |
|
| 102 | 104 | const Glib::ustring& dialog_message) |
| 103 | 105 | { |
| 104 | | if(m_list.size() >= 12) |
| 105 | | Gobby::StatusBar::remove_message(m_list.begin()); |
| | 106 | if(m_visible_messages >= 12) |
| | 107 | { |
| | 108 | for(MessageHandle iter = m_list.begin(); |
| | 109 | iter != m_list.end(); |
| | 110 | ++iter) |
| | 111 | { |
| | 112 | if ((*iter)->is_error()) |
| | 113 | { |
| | 114 | remove_message(iter); |
| | 115 | break; |
| | 116 | } |
| | 117 | else |
| | 118 | { |
| | 119 | // only hide message because whoever installed |
| | 120 | // it is expecting to be able to call |
| | 121 | // remove_message on it |
| | 122 | hide_message(iter); |
| | 123 | if (m_visible_messages < 12) |
| | 124 | break; |
| | 125 | } |
| | 126 | } |
| | 127 | } |
| 106 | 128 | |
| 107 | 129 | Gtk::HBox* bar = Gtk::manage(new Gtk::HBox); |
| … |
… |
|
| 124 | 146 | |
| 125 | 147 | m_list.push_back(new Message(frame, message, dialog_message)); |
| | 148 | ++m_visible_messages; |
| 126 | 149 | Gobby::StatusBar::MessageHandle iter(--m_list.end()); |
| 127 | 150 | |
| … |
… |
|
| 171 | 194 | void Gobby::StatusBar::remove_message(const MessageHandle& handle) |
| 172 | 195 | { |
| 173 | | remove(*(*handle)->widget()); |
| 174 | | delete *handle; |
| | 196 | hide_message(handle); |
| 175 | 197 | m_list.erase(handle); |
| | 198 | } |
| | 199 | |
| | 200 | void Gobby::StatusBar::hide_message(const MessageHandle& handle) |
| | 201 | { |
| | 202 | if(*handle != 0) |
| | 203 | { |
| | 204 | g_assert(m_visible_messages > 0); |
| | 205 | --m_visible_messages; |
| | 206 | remove(*(*handle)->widget()); |
| | 207 | delete *handle; |
| | 208 | *handle = 0; |
| | 209 | } |
| 176 | 210 | } |
| 177 | 211 | |
-
|
r732c22f
|
r2a1e37c
|
|
| 62 | 62 | |
| 63 | 63 | void remove_message(const MessageHandle& handle); |
| | 64 | void hide_message(const MessageHandle& handle); |
| 64 | 65 | |
| 65 | 66 | MessageHandle invalid_handle(); |
| … |
… |
|
| 99 | 100 | const Preferences& m_preferences; |
| 100 | 101 | MessageList m_list; |
| | 102 | unsigned int m_visible_messages; |
| 101 | 103 | |
| 102 | 104 | Gtk::Statusbar m_bar_position; |