Re: Hiding GtkToolButton problem, Win32 specific behaviour or potential bug ?



Hi,

You're not using the right callback format for the "clicked" signal.
http://library.gnome.org/devel/gtk/stable/GtkToolButton.html#GtkToolButton-clicked

You're using for both handler 1 and handler 2:
  void user_function (void)

while it should be:
  void user_function (GtkToolButton *toolbutton, gpointer user_data)

When you use a signal, ALWAYS look at the prototype you need to use for the callback.

This way, as you do the same thing in both callbacks, you can use a single callback to process the signals emitted by both buttons:

void on_toolbutton_clicked (GtkToolButton *toolbutton,
        gpointer user_data)
{
        gtk_widget_hide (GTK_WIDGET (toolbutton));
}

Hope this resolves your problem...

Cheers,

Luis

zylon post cz a écrit :
Hello,
I've encountered a problem with hiding a GtkToolButton inserted into GtkToolbar. Consider the small program 
bellow.
When pressing button2, this program freezes. I don't know why this happens - I think the reasons may be two:

1. Using threads on Win32
2. Some bug.

The problem appears when using GTK 2.12.X under Windows and does not appear under Linux (GTK 2.10.X 2.12.X) 
and also does
not appear when using GTK 2.10.X under Windows. If I remove the threads related code, everything works 
perfectly on all platforms
with all versions of GTK.

I've also investigated, that the button being hidden must be first in the toolbar and must have the signal 
connected, in other
case the problem does not appear.

What reason is correct ?

Thanks for ideas



#include <gtk/gtk.h>

GtkWindow *window;
GtkToolButton *button1;
GtkToolButton *button2;
GtkToolbar *toolbar;

void handler1() {
        gtk_widget_hide(GTK_WIDGET(button2));
        
        
}

void handler2() {
        /*CRASH*/
        gtk_widget_hide(GTK_WIDGET(button1));
}

void quitHandler() {
        
        gtk_main_quit();
        
}


int main(int argc,char* argv[]) {
        g_thread_init(NULL);
        gdk_threads_init();
        gdk_threads_enter();
        
        gtk_init(&argc,&argv);
        
        /*Window*/
        window=GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
        
        /*Toolbar*/
        toolbar=GTK_TOOLBAR(gtk_toolbar_new());
        
        /*Buttons*/
        button1=GTK_TOOL_BUTTON(gtk_tool_button_new_from_stock("gtk-add"));
        button2=GTK_TOOL_BUTTON(gtk_tool_button_new_from_stock("gtk-edit"));
        
        gtk_toolbar_insert(toolbar,GTK_TOOL_ITEM(button1),0);
        gtk_toolbar_insert(toolbar,GTK_TOOL_ITEM(button2),1);
        
        gtk_container_add(GTK_CONTAINER(window),GTK_WIDGET(toolbar));
        
        /*Show all*/
        gtk_widget_show_all(GTK_WIDGET(window));
        gtk_widget_show(GTK_WIDGET(window));
        
        g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(handler1),NULL);
        g_signal_connect(G_OBJECT(button2),"clicked",G_CALLBACK(handler2),NULL);
        g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(quitHandler),NULL);
        
        gtk_main();
        
        gdk_threads_leave();
}




_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]