Re: Entry and keyboard



On Sun, 2001-08-26 at 06:02, Arno wrote:
> Hello.
> 
> I have a gtk_entry and if I click on the button send it sends the text. I 
> would like that one supports on enter makes the same thing. Somebody could 
> help me? 
> 

Connecting the same callback to both the button's "clicked" and the
entry's "activate" event, as Steph suggested is probably what you want.
Markus suggestion, connecting a callback to the entry's
"key_pressed_event" and dispatching to other functions based on the key
value gives you a bit more control over the entry though.  You can for
example use this to do auto-completion or prevent data in a "wrong"
format to be entered.  In most cases the activate signal is what you
want to connect to, but there are times where the key_pressed_event is
useful.

Anyway, I've attached a small program with examples of both.

	/mailund

-- 
I never realized it before, but having looked that over I'm certain
I'd rather have my eyes burned out by zombies with flaming dung sticks
than work on a conscientious Unicode regex engine.
                                   --- Tim Peters, 3 Dec 1998
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>

/* muck-up of send function */
static void
send (GtkEntry *entry)
{
  g_print ("send: \"%s\"\n", gtk_entry_get_text (entry));
}

/* I use three different callbacks, mostly to let the output show
   which signal is being processed.  In a real application, you would
   just led the button and activate signal call the same callback.
   For the key-event a special callback is needed though, to process
   the exact key, so you only send when you press enter and not each
   time you change the text. */
static void
button_send (GtkWidget *dummy, GtkEntry *entry)
{
  g_print ("button_send\n");
  send (entry);
}

static void
activate_send (GtkWidget *dummy, GtkEntry *entry)
{
  g_print ("activate_send\n");
  send (entry);
}

static void
key_event (GtkWidget *dummy, GdkEvent *event, GtkEntry *entry)
{
  g_print ("key_event\n");

  switch (event->key.keyval)
    {
    case GDK_Tab:
      if (strcmp ("a", gtk_entry_get_text (entry)) == 0)
	gtk_entry_set_text (entry, "ape");
      else if (strcmp ("b", gtk_entry_get_text (entry)) == 0)
	gtk_entry_set_text (entry, "bonobo");
      else if (strcmp ("c", gtk_entry_get_text (entry)) == 0)
	gtk_entry_set_text (entry, "chimpanzee");
      break;
    case GDK_Return:
        send (entry);
	break;
    }

}



int
main(int argc, char *argv[])
{
  GtkWidget *win;
  GtkWidget *vbox;
  GtkWidget *entry;
  GtkWidget *button;

  gtk_init (&argc, &argv);

  win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  
  vbox = gtk_vbox_new (TRUE, 0);
  gtk_container_add (GTK_CONTAINER (win), vbox);

  entry = gtk_entry_new ();
  gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);

  button = gtk_button_new_with_label ("Send");
  gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);

  /* setting up signals */
  gtk_signal_connect (GTK_OBJECT (button), "clicked",
		      GTK_SIGNAL_FUNC (button_send),
		      entry);
  gtk_signal_connect (GTK_OBJECT (entry), "activate",
		      GTK_SIGNAL_FUNC (activate_send),
		      entry);
  gtk_signal_connect (GTK_OBJECT (entry), "key_press_event",
		      GTK_SIGNAL_FUNC (key_event),
		      entry);



  gtk_widget_show_all (win);

  gtk_main ();

  return 0;
}

Attachment: pgpfUmIIpEtZ4.pgp
Description: PGP signature



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