gtkmm statusicon quits after creation

2019-08-10 04:30发布

问题:

I have to create a simple application that displays an icon in the systray and a menu from which you can do some operations. the problem is that statusicon is closed immediately after creation. What's missing? I put the sleep to make sure it was created. for 3 seconds something appears in systray, even if it is not the icon that I set.

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

回答1:

You're not running a main loop at all, so no input events can be handled and the program exits after constructing the tray. What you want to do is delete the sleep, and then in your main() function, add the following line right before the return:

Gtk::Main::run();

Then, when you want the application to quit (generally in response to an event of some sort), call

Gtk::Main::quit();