2010-08-23 4 views
1

Мне нужно создать простое приложение, которое отображает значок в systray и меню, из которого вы можете выполнять некоторые операции. проблема в том, что statusicon закрывается сразу после создания. Чего не хватает? Я поставил сон, чтобы убедиться, что он был создан. в течение 3 секунд что-то появляется в systray, даже если это не тот значок, который я установил.gtkmm statusicon завершает работу после создания

Init.cc

#include <gtkmm/main.h> 
#include "Tray.h" 

int main(int argc, char *argv[]) { 
    Gtk::Main kit(argc, argv); 
    printf("Statuicon starting\n"); 
    Tray tray; 
    printf("Statuicon started\n"); 
    return 0; 
} 

Tray.cc

#include "Tray.h" 

Tray::Tray() { 
    set(Gtk::Stock::OK); 

    signal_activate().connect(sigc::mem_fun(*this, &Tray::on_statusicon_activated)); 
    signal_popup_menu().connect(sigc::mem_fun(*this, &Tray::on_statusicon_popup)); 

    set_visible(true); 

    printf("Statusicon created\n"); 

    sleep(3); 
} 

Tray::~Tray() {} 

void Tray::on_statusicon_popup(guint button, guint activate_time) { 
    printf("popup!"); 
} 

void Tray::on_statusicon_activated() { 
    printf("active!"); 
} 

Tray.h

#ifndef GTKMM_TRAY_H 
#define GTKMM_TRAY_H 
#include <gtkmm.h> 
#include <unistd.h> 
using namespace std; 

class Tray : public Gtk::StatusIcon { 
    public: 
     Tray(); 
     ~Tray(); 

    private: 
     virtual void on_statusicon_popup(guint button, guint activate_time); 
     virtual void on_statusicon_activated(); 
}; 

#endif //GTKMM_TRAY_H 

ответ

3

Вы не запущен главный цикл на всех, поэтому никаких входных событий может и программа выйдет после создания лотка. То, что вы хотите сделать, это удалить сон, а затем в своей основной функции(), добавьте следующую строку перед возвращением:

Gtk::Main::run(); 

Затем, когда вы хотите, чтобы приложение бросить курить (как правило, в ответ на мероприятие какого-либо рода), звонок

Gtk::Main::quit();