On 1/15/07, Marshall Lake <[EMAIL PROTECTED]> wrote:


After the text being sent to the text widget ends and process flow falls
back into gtk_main() then all the other widgets within the secondary
dialog appear including the first few lines of text which had been
missing.


This line leads me to believe that you may not be relinquishing control to
the Gtk mainloop.  When the text comes into the second dialog box, are you
locking up the program until it is all read?  For instance, are you simply
reading from a socket or file descriptor repeatedly until the text has all
been received?  If so, that's most likely your problem.

Gtk doesn't run in a separate thread, so when it is instructed to do
something, such as display a widget, it actually queues the work to be
performed later, by the Gtk mainloop.  When a function of yours is called,
such as a callback for a button being pressed, it is the mainloop which
actually does the calling, and it is done with the expectation that the
function will do its work quickly, and then return, allowing the mainloop to
continue running, and dispatching input events, redrawing widgets, etc.  If
one of your callbacks takes an extended amount of time to do something, the
mainloop is unable to run, thus making the UI unresponsive, preventing
expose requests from being serviced, and other Bad Things.

There are a few different ways around this problem.  They all amount to
deferring the work until later, and chopping it up into small pieces, so
that it never actually blocks the mainloop for a significant amount of
time.  For example, you can set up an "idle handler", which will be called
by the Gtk mainloop whenever it doesn't have any other work to do.  Inside
of this callback, you could check the data source to see if any new data has
appeared, and if so, add it to the text widget, and then quickly return (at
which point the mainloop would continue running, and actually expose the new
text on the screen.)  I believe it's also possible to tell the mainloop
about a file descriptor which should be watched, and have it call a function
whenever new data appears.  I have never used this tactic (hopefully someone
else can clarify this), but you might try looking at the documentation for
the Glib mainloop and the Gtk mainloop, both available at
http://www.gtk.org/api/ .

Good luck--if this turns out not to be the problem you're having, be sure to
send a reply with some more description, and we'll see what we can do.

--Matt
_______________________________________________
gtk-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to