InfoBar
| Chapter 8. Miscellaneous Widgets |

## InfoBar

An `InfoBar` may show small items of information or ask brief questions. Unlike a `Dialog`, it appears at the top of the current window instead of opening a new window. Its API is very similar to the Gtk::Dialog API.

Reference

### Example

The `InfoBar` widget is deprecated since gtkmm 4.10. The example shows an info bar consisting of a `Box` with a `Label` and a `Button`.

Figure 8.8. InfoBar

Source Code

File: `examplewindow.h` (For use with gtkmm 4)

    #ifndef GTKMM_EXAMPLEWINDOW_H
    #define GTKMM_EXAMPLEWINDOW_H

    #include <gtkmm.h>

    class ExampleWindow : public Gtk::Window
    {
    public:
      ExampleWindow();
      ~ExampleWindow() override;

    protected:
      //Signal handlers:
      void on_infobar_ok();
      void on_button_quit();
      void on_button_clear();
      void on_textbuffer_changed();
      void on_parsing_error(const Glib::RefPtr<const Gtk::CssSection>& section,
        const Glib::Error& error);

      void set_infobar_background();

      //Child widgets:
      Gtk::Box m_VBox;

      Gtk::ScrolledWindow m_ScrolledWindow;
      Gtk::TextView m_TextView;

      Glib::RefPtr<Gtk::TextBuffer> m_refTextBuffer;

      Gtk::Box m_InfoBar;
      Gtk::Label m_Message_Label;
      Gtk::Button m_Button_OK;

      Gtk::Box m_ButtonBox;
      Gtk::Button m_Button_Quit;
      Gtk::Button m_Button_Clear;
    };

    #endif //GTKMM_EXAMPLEWINDOW_H

File: `examplewindow.cc` (For use with gtkmm 4)

    #include "examplewindow.h"
    #include <iostream>

    // The Gtk::InfoBar widget is deprecated since gtk/gtkmm 4.10.
    // A Box with a Label and Button is often a good replacement.
    // If you don't care about its background color, it's even easier
    // than the InfoBar replacement in this example program.

    ExampleWindow::ExampleWindow()
    : m_VBox(Gtk::Orientation::VERTICAL, 6),
      m_InfoBar(Gtk::Orientation::HORIZONTAL, 6),
      m_Button_OK("_OK", true),
      m_ButtonBox(Gtk::Orientation::HORIZONTAL, 6),
      m_Button_Quit("_Quit", true),
      m_Button_Clear("_Clear", true)
    {
      set_title("Infobar example");
      set_default_size(400, 200);

      m_VBox.set_margin(6);
      set_child(m_VBox);

      // Add the message label to the InfoBar:
      m_InfoBar.append(m_Message_Label);
      m_Message_Label.set_margin_start(5);
      m_Message_Label.set_hexpand(true);
      m_Message_Label.set_halign(Gtk::Align::START);

      // Add an ok button to the InfoBar:
      m_InfoBar.append(m_Button_OK);
      m_Button_OK.set_margin(5);

      // Add the InfoBar to the vbox:
      m_VBox.append(m_InfoBar);

      // Create the buffer and set it for the TextView:
      m_refTextBuffer = Gtk::TextBuffer::create();
      m_TextView.set_buffer(m_refTextBuffer);

      // Add the TextView, inside a ScrolledWindow:
      m_ScrolledWindow.set_child(m_TextView);

      // Show the scrollbars only when they are necessary:
      m_ScrolledWindow.set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC);
      m_ScrolledWindow.set_expand();

      m_VBox.append(m_ScrolledWindow);

      // Add button box:
      m_VBox.append(m_ButtonBox);

      m_ButtonBox.append(m_Button_Clear);
      m_ButtonBox.append(m_Button_Quit);
      m_Button_Clear.set_hexpand(true);
      m_Button_Clear.set_halign(Gtk::Align::END);

      // Connect signals:
      m_Button_OK.signal_clicked().connect(sigc::mem_fun(*this,
                  &ExampleWindow::on_infobar_ok) );
      m_Button_Quit.signal_clicked().connect(sigc::mem_fun(*this,
                  &ExampleWindow::on_button_quit) );
      m_Button_Clear.signal_clicked().connect(sigc::mem_fun(*this,
                  &ExampleWindow::on_button_clear) );
      m_refTextBuffer->signal_changed().connect(sigc::mem_fun(*this,
                  &ExampleWindow::on_textbuffer_changed) );

      // Keep the InfoBar hidden until a message needs to be shown:
      m_InfoBar.set_visible(false);
      set_infobar_background();

      // Make the clear button insensitive until text is typed in the buffer.  When
      // the button is sensitive and it is pressed, the InfoBar is displayed with a
      // message.
      m_Button_Clear.set_sensitive(false);
    }

    ExampleWindow::~ExampleWindow()
    {
    }

    void ExampleWindow::on_infobar_ok()
    {
      // Clear the message and hide the info bar:
      m_Message_Label.set_text("");
      m_InfoBar.set_visible(false);
    }

    void ExampleWindow::on_button_quit()
    {
      close();
    }

    void ExampleWindow::on_button_clear()
    {
      m_refTextBuffer->set_text("");
      m_Message_Label.set_text("Cleared the text.");
      m_InfoBar.set_visible(true);
    }

    void ExampleWindow::on_textbuffer_changed()
    {
      m_Button_Clear.set_sensitive(m_refTextBuffer->size() > 0);
    }

    void ExampleWindow::set_infobar_background()
    {
      // Concerning color in CSS files, see https://www.w3.org/TR/css-color-3.
      const std::string css = "#infobarbox { background-color: beige; }";

      m_InfoBar.set_name("infobarbox");
      auto css_provider = Gtk::CssProvider::create();
      Gtk::StyleProvider::add_provider_for_display(
        m_InfoBar.get_display(), css_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);

      css_provider->load_from_data(css);
      css_provider->signal_parsing_error().connect(
        sigc::mem_fun(*this, &ExampleWindow::on_parsing_error));
    }

    void ExampleWindow::on_parsing_error(const Glib::RefPtr<const Gtk::CssSection>& section,
      const Glib::Error& error)
    {
      std::cerr << "on_parsing_error(): " << error.what() << std::endl;
      if (section)
      {
        const auto file = section->get_file();
        if (file)
        {
          std::cerr << "  URI = " << file->get_uri() << std::endl;
        }

        auto start_location = section->get_start_location();
        auto end_location = section->get_end_location();
        std::cerr << "  start_line = " << start_location.get_lines()+1
                  << ", end_line = " << end_location.get_lines()+1 << std::endl;
        std::cerr << "  start_position = " << start_location.get_line_chars()
                  << ", end_position = " << end_location.get_line_chars() << std::endl;
      }
    }

File: `main.cc` (For use with gtkmm 4)

    #include "examplewindow.h"
    #include <gtkmm/application.h>

    int main(int argc, char *argv[])
    {
      auto app = Gtk::Application::create("org.gtkmm.example");

      //Shows the window and returns when it is closed.
      return app->make_window_and_run<ExampleWindow>(argc, argv);
    }

ProgressBar |  | Tooltips