8

I am using Qt IDE in order to build my application so as to participate to the Ubuntu Showdown contest. In my application, I've done the following:

void show_app(MainWindow *data)
{
    //this works fine:
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_PASSIVE);
    //this crashes the application:
    data->show();
}


void MainWindow::make_indicator()
{
    if(appindicator){
        //appindicator has already been created
        return;
    }
    appindicator = app_indicator_new("Format Junkie Indicator", "formatjunkie", APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
    GtkWidget* showapp_option;
    GtkWidget* indicatormenu = gtk_menu_new();
    GtkWidget* item = gtk_menu_item_new_with_label("Format Junkie main menu");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), indicatormenu);

    showapp_option = gtk_menu_item_new_with_label("Show App!");
    g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);
    gtk_menu_shell_append(GTK_MENU_SHELL(indicatormenu), showapp_option);

    gtk_widget_show_all(indicatormenu);
    app_indicator_set_status(appindicator, APP_INDICATOR_STATUS_ACTIVE);
    app_indicator_set_attention_icon(appindicator, "dialog-warning");

    app_indicator_set_menu(appindicator, GTK_MENU (indicatormenu));
}

So, basically I am trying to make a simple indicator entry, which, on click, it will hide the indicator and display the application. The indicator can be successfully hidden using the PASSIVE thingy over there, but, during the call data->show();, the application crashes.

Any help on what I am doing wrong would be appreciated! Also, please help me to correct this problem I'm facing (alternatively, I will migrate to the old and good tray icon (it works fine in 12.04, anyway) which I can handle very easily and efficiently)

Ted Gould
  • 3,425
  • 15
  • 23
hytromo
  • 4,904
  • 3
  • 33
  • 63
  • what is the error you are getting? – Hernantz Jul 01 '12 at 14:38
  • no error, it just crashes :) – hytromo Jul 01 '12 at 22:44
  • Can you please add the Stacktrace from the crash to you question? That will point out the exact line at which your app is crashing. If you need help with that, then check out this link http://doc.qt.nokia.com/qtcreator-2.3/creator-debug-mode.html#viewing-call-stack-trace –  Jul 03 '12 at 17:48
  • 3
    Bottom line: do **not** mix GTK and Qt in a C++ application. The event loop is structured differently in each and you will run into nothing but trouble. – Nathan Osman Jul 03 '12 at 20:25

2 Answers2

9

You shouldn't use libappindicator for creating an Application Indicator in Qt programs. There's a better way!

If you have sni-qt installed that will automagically replace QSystemTrayIcon instances with the code for rendering that tray icon as a KDE Status Notifier Item, which the Application Indicator service will pick up and show in the Ubuntu menu bar.

Jorge Castro
  • 70,934
  • 124
  • 466
  • 653
Ted Gould
  • 3,425
  • 15
  • 23
  • Thanks. I know perfectly how the QSystemTrayIcon works, and, as I can see, sni-qt is pre-installed, so I won't be sorry if I have it as a dependency! The rules should be more clear, though, on the indicator thingy (they recommend the use of indicators, while, in fact, Qt creates tray icons which are being transformed into indicators...). You will probably have the bounty, but I have to wait 17 hours. – hytromo Jul 04 '12 at 00:25
  • 2
    This package(sni-qt) is now broken. – Goddard Sep 07 '13 at 05:13
  • 2
    "There's a better way!" Not with Qt5, there isn't. – Nathan Osman Jun 22 '14 at 23:43
-1

I would say you try passing the "this" pointer as a pointer like "*this" here

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), this);

to

g_signal_connect(showapp_option, "activate", G_CALLBACK(show_app), *this);
Hernantz
  • 828
  • 7
  • 12
  • Thanks, by I take this as an erro (it does not compile): error: cannot convert 'MainWindow' to 'gpointer {aka void*}' for argument '4' to 'gulong g_signal_connect_data(gpointer, const gchar*, GCallback, gpointer, GClosureNotify, GConnectFlags)' – hytromo Jul 01 '12 at 22:43