What is the correct way to use g_signal_connect() in C++ for dynamic unity quicklists?
- by hakermania
I want to make my application use dynamic unity quicklists. For building my application I am using C++ and the QtCreator IDE. When a menu action is triggered I want to be able to have access to a non-static function of my MainWindow class so as to be able to update the Graphical User Interface which can be accessed from inside 'normal' MainWindow's functions.
So, I am building up my quicklist like this (mainwindow.cpp):
void MainWindow::enable_unity_quicklist(){
Unity_Menu = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set_bool (Unity_Menu, DBUSMENU_MENUITEM_PROP_VISIBLE, FALSE);
Unity_Stop = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set(Unity_Stop, DBUSMENU_MENUITEM_PROP_LABEL, "Stop");
dbusmenu_menuitem_child_append (Unity_Menu, Unity_Stop);
g_signal_connect (Unity_Stop, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK(&fake_callback), (gpointer)this);
if(!unity_entry)
unity_entry = unity_launcher_entry_get_for_desktop_id("myapp.desktop");
unity_launcher_entry_set_quicklist(unity_entry, Unity_Menu);
dbusmenu_menuitem_property_set_bool(Unity_Menu, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
dbusmenu_menuitem_property_set_bool(Unity_Stop, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
}
void MainWindow::fake_callback(gpointer data){
MainWindow* m = (MainWindow*)data;
m->on_stopButton_clicked();
}
void MainWindow::on_stopButton_clicked(){
//stopping the process...
}
mainwindow.h:
private slots:
void enable_unity_quicklist();
void on_stopButton_clicked();
public slots:
static void fake_callback(gpointer data);
This suggestion was taken from http://old.nabble.com/Using-g_signal_connect-in-class-td18461823.html
The program crashes immediately after I choose the 'Stop' action from the Unity Quicklist. Debugging the program shows that I am not able to access anything MainWindow related inside the on_stopButton_clicked() without crashing. For example, it crashes when doing this check (which is the first 2 lines of code inside this function):
if (!ui->stopButton->isEnabled())
return;
I have also tested lots of other things that I found at the internet, but nothing of them worked. One interesting solution would be to use gtkmm (http://developer.gnome.org/gtkmm-tutorial/stable/sec-connecting-signal-handlers.html.en) but I am not used at all working on GTK applications (I work solely in Qt) and I don't know if this even suits to my occasion.
A compilable example indicating what the problem is can be found at: http://ubuntuone.com/7iKA3wnPmWVp8YNNDLlVQI (3.2Kb)
If you are not familiar with the QtCreator IDE, you can compile with the following commands, as long as you have all the needed libraries:
cd dynamic_unity_quicklists_test; qmake -project; qmake; make