Я пишу приложение для 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 () Я получаю сегфо.
Может ли кто-нибудь указать мне, что я делаю неправильно?
Я попробовал ваш код 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`