Here are two programs that implement through the text viewer widget what you are asking for:
- The Python console in gimp - GemTcl - a tcl interpreter The way I set up the interaction is to listen to both the key-press-event and the insert-text events of the text-viewer. The key-press-event signals to the insert-event handler that it is supposed to enter eval mode: if (!(event->state & GDK_SHIFT_MASK)) { switch(event->keyval) { case GDK_Return: do_eval = true; break; } } and the insert-event catches this before the newline is inserted into the buffer, runs the eval and inserts the result into the buffer: if (do_eval) { // Extract the text between the prompt and the end of the line output = eval(command); gtk_text_buffer_insert(text_buffer, output); } Have a look in GemTcl:gemtcl.cc cb_insert_text() and cb_key_press_command() for details. Hope this helps, Regards, Dov 2009/7/21 Allin Cottrell <cottr...@wfu.edu> > In the context of my gtk app I have an optional "console" -- not > a real shell, but a means of sending commands to the app besides > point-and-click. It's working OK, but for various reasons I'd > like to reformulate it so that I have a loop like this: > > while (command != quit) { > get_a_command(); > do_stuff(); > } > > I'm having trouble with get_a_command(). The criterion for a > command being entered is that Return is pressed in a certain > GtkTextView, to which I have a pointer. But how does the > get_a_command() function know that this has happened? > > I've implemented this via a static int, "command_entered" (a > file-scope global), which is set to 1 by Return and is monitored > by the function in question: > > void get_a_command () { > while (!command_entered) { > if (gtk_events_pending()) { > gtk_main_iteration(); > } > } > command_entered = 0; > } > > This works, but not surprisingly it uses a lot of CPU running > around its tight loop waiting for Return. I then tried adding > g_usleep(10000) into the loop on "while (!command_entered)". > That brought CPU usage down to a sane level, but of course it made > the whole GUI quite gummy. > > It seems there must be a smarter way of doing this, probably using > some of the g_main* apparatus or g_threads, which I'm not really > familiar with, and at my current level of ignorance looking at the > API docs leaves me guessing. Any pointers to get me started would > be very helpful. > > Allin Cottrell > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list > _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list