Search code examples
gtkmm

How to override default signal handler of TextBuffer


I am trying to override the default on_erase signal handler of Gtk::TextView. I derive TextBuffer and override the default handler; but the override is not working. When using cast_static, the RefPtr is valid, but when using cast_dynamic the RefPtr is null.

#include <gtkmm.h>
#include "CTextBuffer.h"
class CMain : public Gtk::Window
{
public:
   CMain();
   virtual ~CMain();
private:
   Gtk::TextView m_textView;
   Glib::RefPtr<CTextBuffer> m_refTextBuffer;
};

#include "CMain.h"
CMain::CMain()
{
   Glib::RefPtr<Gtk::TextBuffer> refTextBuffer = Gtk::TextBuffer::create();
   m_refTextBuffer =  Glib::RefPtr<CTextBuffer>::cast_dynamic(refTextBuffer);
   m_textView.set_buffer(m_refTextBuffer);
   add(m_textView);
   show_all();
}
CMain::~CMain()
{}

#include <gtkmm.h>
class CTextBuffer : public Gtk::TextBuffer
{
public:
   CTextBuffer();
   virtual ~CTextBuffer();
protected:
   virtual void on_erase(const TextBuffer::iterator& range_start, const TextBuffer::iterator& range_end);
};

#include "CTextBuffer.h"
CTextBuffer::CTextBuffer() {}

CTextBuffer::~CTextBuffer() {}

void CTextBuffer::on_erase (const TextBuffer::iterator& range_start, const TextBuffer::iterator& range_end)
{
   Gtk::TextBuffer::on_erase(range_start, range_end);
}

Solution

  • Simply use a ref to your own type:

    CMain::CMain()
    {
        Glib::RefPtr<CTextBuffer> refTextBuffer{ new CTextBuffer };
        m_textView.set_buffer(refTextBuffer);
        add(m_textView);
        show_all();
    }
    
    void CTextBuffer::on_erase (const TextBuffer::iterator& range_start, const TextBuffer::iterator& range_end)
    {
        std::cout << "Own override was called" << std::endl;
        Gtk::TextBuffer::on_erase(range_start, range_end);
    }
    

    You find some more information on how to usw own derived widgets here:

    https://developer.gnome.org/gtkmm-tutorial/stable/sec-builder-using-derived-widgets.html.en