[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]))
    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),
    gtk_editable_insert_text (editable, result, count, position);
    g_signal_handlers_unblock_by_func (G_OBJECT (editable),
                                       G_CALLBACK (insert_text_handler),
  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.

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


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 Borov?ak
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]