1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
   | #include <ctype.h>
#include <gtk/gtk.h>
 
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);
}
 
int main (int   argc,char *argv[])
{
  GtkWidget *window;
  GtkWidget *entry;
 
  gtk_init (&argc, &argv);
 
  /* create a new window */
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title(GTK_WINDOW (window), "GTK Entry");
  g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (gtk_main_quit),NULL);
 
  entry = gtk_entry_new_with_max_length(3);
  g_signal_connect(G_OBJECT(entry), "insert_text",G_CALLBACK(insert_text_handler),NULL);
  gtk_container_add(GTK_CONTAINER (window), entry);
 
  gtk_widget_show_all(window);
 
  gtk_main();
  return(0);
} |