[maemo-developers] how to get the current item of GtkEntryCompletion list when up arrows moves throuth items
From: bocheng at redflag-linux.com bocheng at redflag-linux.comDate: Tue Mar 13 11:12:14 EET 2007
- Previous message: Root Access for GUI App
- Next message: how to get the current item of GtkEntryCompletion list when up arrows moves throuth items
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
main purpose of the code below is when putting some characters such as to ,oa,and so on, the list of completion will show all strings that contains the characters ,but when I tip Tab key on the keyboard , it moves through all the match items in the list ,But what signal should I connect to show current string on the entry when tipping Tab continuous in the matching list ? /* Entry Completion gcc entry_completion.c `pkg-config gtk+-2.0 --cflags --libs` */ #include <gtk/gtk.h> #include <gdk/gdkkeysyms.h> gboolean match_selected_cb(GtkEntryCompletion *completion, GtkTreeModel * model , GtkTreeIter * iter,void * data) { char * select = 0; gtk_tree_model_get(model,iter,0,&select,-1); gtk_entry_set_text(data,select); } gboolean action_cb(GtkEntryCompletion* completion, int index,void * data) { printf("SSSS %d\n",index); return TRUE; } gboolean match_rule(GtkEntryCompletion* completion , const char * key,GtkTreeIter * iter , void * usr_data) { GtkTreeModel *model; model = gtk_entry_completion_get_model (completion); char * context = NULL ; gtk_tree_model_get(model,iter,0,&context,-1); if(strstr(context,key)) return TRUE; else return FALSE; } static GtkWidget *window = NULL; GdkEvent* synthesize_gdk_event(GdkEventType evtType, GtkWidget *widget, guint keyVal) { GdkEvent *evt = NULL; GdkKeymapKey *keys; gint n_keys; GtkWidget *temp_widget; guint16 hardware_keycode; if (gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), keyVal, &keys, &n_keys)) { temp_widget = GTK_WIDGET(widget); hardware_keycode = keys[0].keycode; g_free (keys); evt = gdk_event_new (evtType); evt->key.window = g_object_ref(temp_widget->window); evt->key.hardware_keycode = hardware_keycode; /* these are optional but possibly nice to have */ //toevt->key.keyval = gdk_unicode_to_keyval (keyVal); evt->key.keyval = keyVal; /* the rest are no-ops */ evt->key.send_event = FALSE; /* seems unused except for dnd */ evt->key.time = GDK_CURRENT_TIME; } return evt; } tab_cb(GtkWidget *window, GdkEventKey *ev,gpointer data) { if(ev->keyval == GDK_Tab) { GdkEvent * fake = synthesize_gdk_event(GDK_KEY_PRESS, GTK_WIDGET(data), GDK_Down); // GdkEvent * fake1 = synthesize_gdk_event(GDK_KEY_PRESS, GTK_WIDGET(window), GDK_Return); gtk_main_do_event(fake); // gtk_main_do_event(fake1); return 1; } return 0; } /* Creates a tree model containing the completions */ GtkTreeModel * create_completion_model (void) { GtkListStore *store; GtkTreeIter iter; store = gtk_list_store_new (1, G_TYPE_STRING); /* Append one word */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "GNOME", -1); /* Append another word */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "total", -1); /* And another word */ gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "totally", -1); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "totallly", -1); gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, "totalllly", -1); return GTK_TREE_MODEL (store); } GtkWidget * do_entry_completion (GtkWidget *do_widget) { GtkWidget *vbox; GtkWidget *label; GtkWidget *entry; GtkEntryCompletion *completion; GtkTreeModel *completion_model; if (!window) { window = gtk_dialog_new_with_buttons ("GtkEntryCompletion", GTK_WINDOW (do_widget), 0, GTK_STOCK_CLOSE, GTK_RESPONSE_NONE, NULL); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); g_signal_connect (window, "response", G_CALLBACK (gtk_widget_destroy), NULL); g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window); vbox = gtk_vbox_new (FALSE, 5); gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->vbox), vbox, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), "Completion demo, try writing <b>total</b> or <b>gnome</b> for example."); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0); /* Create our entry */ entry = gtk_entry_new (); g_signal_connect(entry,"key_press_event",tab_cb,entry); gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0); /* Create the completion object */ completion = gtk_entry_completion_new (); /* Assign the completion to the entry */ gtk_entry_set_completion (GTK_ENTRY (entry), completion); g_object_unref (completion); /* Create a tree model and use it as the completion model */ completion_model = create_completion_model (); gtk_entry_completion_set_model (completion, completion_model); g_object_unref (completion_model); gtk_entry_completion_set_match_func(completion,match_rule,NULL,NULL); g_signal_connect (completion, "match_selected", G_CALLBACK (match_selected_cb),entry); // g_signal_connect (completion, "action_activated" , G_CALLBACK (action_cb),entry); /* Use model column 0 as the text column */ gtk_entry_completion_set_text_column (completion, 0); } if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show_all (window); else gtk_widget_destroy (window); return window; } main(int argc,char ** argv) { gtk_init(&argc,&argv); GtkWidget * gg =do_entry_completion(NULL); gtk_widget_show_all(gg); gtk_main(); return 0; } -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.maemo.org/pipermail/maemo-developers/attachments/20070313/dfcaffef/attachment.htm
- Previous message: Root Access for GUI App
- Next message: how to get the current item of GtkEntryCompletion list when up arrows moves throuth items
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]