Не удается заставить iconify () и deiconify () работать правильно

Я пишу приложение для Ubuntu с C ++ и Gtkmm. В моем приложении я использую libappindicator, чтобы показать значок с простым меню в области уведомлений. Пиктограмма и меню работают нормально, я могу свернуть окно на панель (используя метод iconify ()) с помощью действия пользователя во всплывающем меню, но метод deiconify () не работает, окно на панели остается свернутым Единственный способ восстановить окно - активировать его вручную, нажав на иконку панели.

Вот некоторый код:

class CMainWindow: public Gtk::Window {
...
    Glib::RefPtr<Gtk::StyleContext>     m_rStyle;
    Glib::RefPtr<Gtk::UIManager>        m_rUIManager;
    Glib::RefPtr<Gtk::ActionGroup>      m_rActionGroup;
...
public:
...
    void                TrayInit();
    void                TrayWinShow();
    void                TrayWinExit();
... 
};

// this method is called from CMainWindow constructor
void CMainWindow::TrayInit() {
    m_rActionGroup = Gtk::ActionGroup::create();

    m_rActionGroup->add(Gtk::Action::create("Show", "Show"),
        sigc::mem_fun(*this, &CMainWindow::TrayWinShow));
    m_rActionGroup->add(Gtk::Action::create("Hide", "Hide"),
        sigc::mem_fun(*this, &CMainWindow::TrayWinHide));

    m_rUIManager = Gtk::UIManager::create();
    m_rUIManager->insert_action_group(m_rActionGroup);
    add_accel_group(m_rUIManager->get_accel_group());

    Glib::ustring strUI =
            "<ui>"
            "  <popup name='IndicatorPopup'>"
                "    <menuitem action='Show' />"
            "    <menuitem action='Hide' />"
            "  </popup>"
            "</ui>";

    m_rUIManager->add_ui_from_string(strUI);

    Gtk::Widget *pWidget;
    pWidget = m_rUIManager->get_widget("/ui/IndicatorPopup");

    m_pAppIcon = app_indicator_new("sample", "sample_icon",
        APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
    app_indicator_set_status(m_pAppIcon, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_menu(m_pAppIcon, GTK_MENU(pWidget->gobj()));
}

void CMainWindow::TrayWinShow() {
    deiconify();
}

void CMainWindow::TrayWinHide() {
    iconify();
}

Также я попытался использовать методы hide () / show ():

void CMainWindow::TrayWinShow() {
    show();
    get_application()->release();
}

void CMainWindow::TrayWinHide() {
    get_application()->hold();
    hide();
}

Этот вариант правильно скрывает окно, но когда он вызывает show () Я получаю сегфо.

Может ли кто-нибудь указать мне, что я делаю неправильно?

3
задан 12 August 2014 в 21:54

1 ответ

Я попробовал ваш код iconify()/deiconify(), и он работает. Я добавил минимальный код для запуска. Можете ли вы подтвердить, что эта версия работает?

#include <gtkmm.h>
#include <libappindicator/app-indicator.h>
#include <gtkmm/stylecontext.h>

class CMainWindow: public Gtk::Window {
  Glib::RefPtr<Gtk::StyleContext> m_rStyle;
  Glib::RefPtr<Gtk::UIManager>    m_rUIManager;
  Glib::RefPtr<Gtk::ActionGroup>  m_rActionGroup;
  AppIndicator*                   m_pAppIcon;
public:
  void TrayInit();
  void TrayWinShow();
  void TrayWinHide();
  void TrayWinExit();
};

void CMainWindow::TrayInit() {
  m_rActionGroup = Gtk::ActionGroup::create();
  m_rActionGroup->add(Gtk::Action::create("Show", "Show"),
    sigc::mem_fun(*this, &CMainWindow::TrayWinShow));
  m_rActionGroup->add(Gtk::Action::create("Hide", "Hide"),
    sigc::mem_fun(*this, &CMainWindow::TrayWinHide));
  m_rUIManager = Gtk::UIManager::create();
  m_rUIManager->insert_action_group(m_rActionGroup);
  add_accel_group(m_rUIManager->get_accel_group());
  Glib::ustring strUI =
    "<ui>"
    "  <popup name='IndicatorPopup'>"
    "    <menuitem action='Show' />"
    "    <menuitem action='Hide' />"
    "  </popup>"
    "</ui>";
  m_rUIManager->add_ui_from_string(strUI);
  Gtk::Widget *pWidget;
  pWidget = m_rUIManager->get_widget("/ui/IndicatorPopup");
  m_pAppIcon = app_indicator_new("sample", "weather-clear-night",
    APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
  app_indicator_set_status(m_pAppIcon, APP_INDICATOR_STATUS_ACTIVE);
  app_indicator_set_menu(m_pAppIcon, GTK_MENU(pWidget->gobj()));
}

void CMainWindow::TrayWinShow() {
  deiconify();
}

void CMainWindow::TrayWinHide() {
  iconify();
}

int main(int argc, char** argv) {
  Glib::RefPtr<Gtk::Application> app = 
    Gtk::Application::create(argc, argv,"org.gtkmm.examples.base");
  CMainWindow c;
  c.set_default_size(200, 200);
  c.TrayInit();
  return app->run(c);
}

Я сохранил ее как test.cpp и скомпилировал следующим образом:

g++ test.cpp  `pkg-config --cflags --libs gtkmm-3.0 appindicator3-0.1`
0
ответ дан 12 August 2014 в 21:54

Другие вопросы по тегам:

Похожие вопросы: