Привет ребят.
Пишу приложение для Убунты и Юнити. Использую C++ и Gtkmm, также я использую libappindicator для иконки в трее, с простым присоединённым меню: Show, Hide которое должно прятать окно и возвращать обратно.
Вот собственно часть кода:
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();
}
Так вот, правильно работает только iconify() - окно прячется на панэль, deiconify() - не делает ничего, окно остаётся на панэли. Код отлаживал, deiconify() исполняется, но ничего не происходит.
Так же пробовал вариант с методами show()/hide():
void CMainWindow::TrayWinShow() {
show();
get_application()->release();
}
void CMainWindow::TrayWinHide() {
get_application()->hold();
hide();
}
В єтом варианте окно прячется (даже с панели), но при вызове show() - получаю segfault.
Кто нибудь подскажет в какую сторону копать?