Changeset 2a1e37c2ebaa4d166360a8bed2b730ac8cdc8203

Show
Ignore:
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:
3 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r732c22f r2a1e37c  
     12009-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 
    192009-11-09  Benjamin Herr  <ben@0x539.de> 
    210 
  • code/core/statusbar.cpp

    r732c22f r2a1e37c  
    6363        } 
    6464 
     65        bool is_error() { return !m_detail_desc.empty(); } 
     66 
    6567        Gtk::Widget* widget() const { return m_widget; } 
    6668 
     
    7476                            const Preferences& preferences): 
    7577        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) 
    7779{ 
    7880        pack_end(m_bar_position, Gtk::PACK_SHRINK); 
     
    102104                              const Glib::ustring& dialog_message) 
    103105{ 
    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        } 
    106128 
    107129        Gtk::HBox* bar = Gtk::manage(new Gtk::HBox); 
     
    124146 
    125147        m_list.push_back(new Message(frame, message, dialog_message)); 
     148        ++m_visible_messages; 
    126149        Gobby::StatusBar::MessageHandle iter(--m_list.end()); 
    127150 
     
    171194void Gobby::StatusBar::remove_message(const MessageHandle& handle) 
    172195{ 
    173         remove(*(*handle)->widget()); 
    174         delete *handle; 
     196        hide_message(handle); 
    175197        m_list.erase(handle); 
     198} 
     199 
     200void 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        } 
    176210} 
    177211 
  • code/core/statusbar.hpp

    r732c22f r2a1e37c  
    6262 
    6363        void remove_message(const MessageHandle& handle); 
     64        void hide_message(const MessageHandle& handle); 
    6465 
    6566        MessageHandle invalid_handle(); 
     
    99100        const Preferences& m_preferences; 
    100101        MessageList m_list; 
     102        unsigned int m_visible_messages; 
    101103 
    102104        Gtk::Statusbar m_bar_position;