never exiting program



Hi,

I've tried to make a function for showing a single function blocking
message box.

If I run it in an event handler from a window with only one button for
kicking off anything works as expected but the main program (closed by
the window managers button) is never coming back.

Why doean't it?

And how can I do better?

<snip>

procedure MsgBoxCB(data : pointer); cdecl;
begin
        ready := true;
end;

procedure MsgBox(const title, msg: String);
var
        dlg:    pGtkDialog;
        btnOk:  pGtkWidget;
begin
        ready := FALSE;
        
        dlg := pGtkDialog(gtk_dialog_new);
        gtk_window_set_title(pGtkWindow(dlg), PGCHAR(@title));
        gtk_window_set_modal(pGtkWindow(dlg), TRUE);
        gtk_window_set_policy(pGtkWindow(dlg),0,0,0);
        gtk_window_set_position(pGtkWindow(dlg), GTK_WIN_POS_CENTER);
        btnOk := gtk_button_new_with_label('OK');
        gtk_box_pack_start(pGtkBox(dlg^.action_area), btnOk, FALSE, FALSE, 5);
        gtk_window_set_focus(pGtkWindow(dlg), btnOk);
        gtk_widget_show(btnOk);
        gtk_container_add( GTK_CONTAINER( GTK_DIALOG(dlg)^.vbox ),
                gtk_label_new(PGCHAR(@msg))
        );
        gtk_signal_connect_object(pGtkObject(btnOk), 'clicked', 
                        GTK_SIGNAL_FUNC(@gtk_widget_destroy),
                        pGtkObject(dlg));
        gtk_signal_connect(pGtkObject(dlg), 'key-press-event', TGtkSignalFUnc(@MsgBoxCB), nil);
        
        gtk_widget_show_all(pGtkWidget(dlg));
        
        while NOT (ready) do gtk_main_iteration ();
        
        gtk_widget_destroy(GTK_WIDGET(dlg));
end;

</snip>

gdb tells me when I break at the program hanging after close:

(gdb) bt
#0  0x2832fcac in poll () from /usr/lib/libc.so.4
#1  0x2818d6cf in g_main_poll () from /usr/local/lib/libglib12.so.3
#2  0x2818d09e in g_main_iterate () from /usr/local/lib/libglib12.so.3
#3  0x2818d369 in g_main_iteration () from /usr/local/lib/libglib12.so.3
#4  0x2822cad2 in gtk_main_iteration ()
from /usr/X11R6/lib/libgtk12.so.2
#5  0x804b73d in GTKMSGBOX_MSGBOX$SHORTSTRING$SHORTSTRING ()
#6  0x8062756 in DOTEST () at test_gtkmsgbox.pp:14
#7  0x2822e255 in gtk_marshal_NONE__NONE ()
from /usr/X11R6/lib/libgtk12.so.2
#8  0x2825ea7a in gtk_handlers_run () from /usr/X11R6/lib/libgtk12.so.2
#9  0x2825dee9 in gtk_signal_real_emit ()
from /usr/X11R6/lib/libgtk12.so.2
#10 0x2825bf3f in gtk_signal_emit () from /usr/X11R6/lib/libgtk12.so.2
#11 0x281cb324 in gtk_button_clicked ()
from /usr/X11R6/lib/libgtk12.so.2
#12 0x281cc939 in gtk_real_button_released ()
from /usr/X11R6/lib/libgtk12.so.2
#13 0x2822e255 in gtk_marshal_NONE__NONE ()
from /usr/X11R6/lib/libgtk12.so.2
#14 0x2825dd75 in gtk_signal_real_emit ()
from /usr/X11R6/lib/libgtk12.so.2
#15 0x2825bf3f in gtk_signal_emit () from /usr/X11R6/lib/libgtk12.so.2
#16 0x281cb260 in gtk_button_released ()
from /usr/X11R6/lib/libgtk12.so.2
#17 0x281cc2b0 in gtk_button_button_release ()
from /usr/X11R6/lib/libgtk12.so.2
#18 0x2822dedf in gtk_marshal_BOOL__POINTER ()
from /usr/X11R6/lib/libgtk12.so.2
#19 0x2825df22 in gtk_signal_real_emit ()
from /usr/X11R6/lib/libgtk12.so.2
#20 0x2825bf3f in gtk_signal_emit () from /usr/X11R6/lib/libgtk12.so.2
#21 0x28293fb4 in gtk_widget_event () from /usr/X11R6/lib/libgtk12.so.2
#22 0x2822de31 in gtk_propagate_event ()
from /usr/X11R6/lib/libgtk12.so.2
#23 0x2822cfa2 in gtk_main_do_event () from /usr/X11R6/lib/libgtk12.so.2
#24 0x280a0b88 in gdk_event_dispatch ()
from /usr/X11R6/lib/libgdk12.so.2
#25 0x2818cc8b in g_main_dispatch () from /usr/local/lib/libglib12.so.3
#26 0x2818d2b4 in g_main_iterate () from /usr/local/lib/libglib12.so.3
#27 0x2818d44c in g_main_run () from /usr/local/lib/libglib12.so.3
#28 0x2822c85f in gtk_main () from /usr/X11R6/lib/libgtk12.so.2
#29 0x8062837 in main () at test_gtkmsgbox.pp:33

TIA,
Marc





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