[Glade-users] How to block some input in GtkEntry field




Thank you guys for a very quick response. Please take a look at this code that I found under 
library.gnome.org. This code forces all characters to uppercase, and limits the range of characters to A-Z. I 
am doing very similar thing, only need to make sure I permit only digits and '.' (dots) at certain places so 
to validate an IP address entry. However, I don't understand a few things here.
 
void insert_text_handler (GtkEntry    *entry,
                          const gchar *text,
                          gint         length,
                          gint        *position,
                          gpointer     data)
{
  GtkEditable *editable = GTK_EDITABLE(entry);
  int i, count=0;
  gchar *result = g_new (gchar, length);

  for (i=0; i < length; i++) {
    if (!isalpha(text[i]))
      continue;
    result[count++] = islower(text[i]) ? toupper(text[i]) : text[i];
  }
  
  if (count > 0) {
    g_signal_handlers_block_by_func (G_OBJECT (editable),
                                     G_CALLBACK (insert_text_handler),
                                     data);
    gtk_editable_insert_text (editable, result, count, position);
    g_signal_handlers_unblock_by_func (G_OBJECT (editable),
                                       G_CALLBACK (insert_text_handler),
                                       data);
  }
  g_signal_stop_emission_by_name (G_OBJECT (editable), "insert_text");

  g_free (result);
}

What exactly are we blocking/unblocking with the calls to g_signal_handlers_block_by_func and 
_unblock_by_func and why we need to do this?
Also, since we are typing char by char, the text argument seem to contain only one char at a time and the 
length arg is 1 and so the result string is going to have only one char, so why do we need to have a loop?
 
I appreciate your help.
Thanks,
Arthur.

 
From: tadeboro at gmail.com
Date: Wed, 25 Aug 2010 22:39:32 +0200
Subject: Re: [Glade-users] How to block some input in GtkEntry field
To: axischire at gmail.com
CC: ashats at hotmail.com; glade-users at lists.ximian.com

Hi.

Validation should be done prior insertion (so you actually prevent
character from being inserted) like Cristobal said. You can do that by
connecting to GtkEditable::insert-text signal. If the input is
invalid, you simply stop emission of this signal using
g_signal_stop_emission_by_name(), which will cause default handler to
be skipped and text ignored.

Tadej


-- 
Tadej Borov?ak
tadeboro.blogspot.com
tadeboro at gmail.com
tadej.borovsak at gmail.com
                                          
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/glade-users/attachments/20100825/7ba0ec28/attachment-0001.html 




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