gtkmm statusicon закрывается после создания - PullRequest
1 голос
/ 23 августа 2010

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

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!");
}

Лоток.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

1 Ответ

3 голосов
/ 23 августа 2010

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

Gtk::Main::run();

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

Gtk::Main::quit();
...