/** * Read address book, creating all entries in the completion index. */ static void read_address_book(gchar *folderpath) { free_all_addresses(); free_completion_list(); #ifndef USE_ALT_ADDRBOOK addrindex_load_completion( add_address, folderpath ); #else GError* error = NULL; addrcompl_initialize(); if (! addrindex_dbus_load_completion(add_address, &error)) { g_warning("Failed to populate address completion list"); g_error_free(error); return; } #endif /* plugins may hook in here to modify/extend the completion list */ if(!folderpath) { hooks_invoke(ADDDRESS_COMPLETION_BUILD_ADDRESS_LIST_HOOKLIST, &g_address_list); } g_address_list = g_list_reverse(g_address_list); g_completion_list = g_list_reverse(g_completion_list); /* merge the completion entry list into g_completion */ if (g_completion_list) { g_completion_add_items(g_completion, g_completion_list); if (debug_get_mode()) debug_print("read %d items in %s\n", g_list_length(g_completion_list), folderpath?folderpath:"(null)"); } }
int main (int argc, char *argv[]) { GCompletion *cmp; GList *items; gchar *prefix; #ifdef __SYMBIAN32__ g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL); g_set_print_handler(mrtPrintHandler); #endif /*__SYMBIAN32__*/ cmp = g_completion_new (NULL); items = NULL; items = g_list_append (items, "a\302\243"); items = g_list_append (items, "a\302\244"); items = g_list_append (items, "bb"); items = g_list_append (items, "bc"); g_completion_add_items (cmp, items); items = g_completion_complete (cmp, "a", &prefix); g_assert (!strcmp ("a\302", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete_utf8 (cmp, "a", &prefix); g_assert (!strcmp ("a", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete (cmp, "b", &prefix); g_assert (!strcmp ("b", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete_utf8 (cmp, "b", &prefix); g_assert (!strcmp ("b", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete (cmp, "a", NULL); g_assert (g_list_length (items) == 2); items = g_completion_complete_utf8 (cmp, "a", NULL); g_assert (g_list_length (items) == 2); g_completion_free (cmp); #if __SYMBIAN32__ testResultXml("completion-test"); #endif /* EMULATOR */ return 0; }
int main (int argc, char* argv[]) { FILE *file; gchar buf[1024]; GList *list; GList *result; GList *tmp; GCompletion *cmp; gint i; gchar *longp = NULL; if (argc < 3) { g_warning ("Usage: %s filename prefix1 [prefix2 ...]\n", argv[0]); return 1; } file = fopen (argv[1], "r"); if (!file) { g_warning ("Cannot open %s\n", argv[1]); return 1; } cmp = g_completion_new (NULL); list = g_list_alloc (); while (fgets (buf, 1024, file)) { list->data = g_strdup (buf); g_completion_add_items (cmp, list); } fclose (file); for (i = 2; i < argc; ++i) { printf ("COMPLETING: %s\n", argv[i]); result = g_completion_complete (cmp, argv[i], &longp); g_list_foreach (result, (GFunc) printf, NULL); printf ("LONG MATCH: %s\n", longp); g_free (longp); longp = NULL; } g_list_foreach (cmp->items, (GFunc) g_free, NULL); g_completion_free (cmp); g_list_free (list); return 0; }
int main (int argc, char *argv[]) { GCompletion *cmp; GList *items; gchar *prefix; #ifdef SYMBIAN g_log_set_handler (NULL, G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL); #endif cmp = g_completion_new (NULL); items = NULL; items = g_list_append (items, "Abcdef"); items = g_list_append (items, "AbcDEF"); items = g_list_append (items, "bc"); items = g_list_append (items, "bd"); g_completion_add_items (cmp, items); g_completion_set_compare(cmp,strncasecmp); items = g_completion_complete (cmp, "aB", &prefix); g_assert (!strcmp ("aBc", prefix)); g_free (prefix); g_completion_remove_items(cmp,items); items = g_completion_complete (cmp, "aB", &prefix); // g_assert(items == NULL); items = g_completion_complete (cmp, "b", &prefix); g_assert(!strcmp("b",prefix)); g_free(prefix); g_completion_clear_items(cmp); items = g_completion_complete (cmp, "b", &prefix); g_assert(items == NULL); #if SYMBIAN testResultXml("completion_test"); #endif /* EMULATOR */ return 0; }
int main (int argc, char *argv[]) { GCompletion *cmp; GList *items; gchar *prefix; cmp = g_completion_new (NULL); items = NULL; items = g_list_append (items, "a\302\243"); items = g_list_append (items, "a\302\244"); items = g_list_append (items, "bb"); items = g_list_append (items, "bc"); g_completion_add_items (cmp, items); items = g_completion_complete (cmp, "a", &prefix); g_assert (!strcmp ("a\302", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete_utf8 (cmp, "a", &prefix); g_assert (!strcmp ("a", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete (cmp, "b", &prefix); g_assert (!strcmp ("b", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete_utf8 (cmp, "b", &prefix); g_assert (!strcmp ("b", prefix)); g_assert (g_list_length (items) == 2); g_free (prefix); items = g_completion_complete (cmp, "a", NULL); g_assert (g_list_length (items) == 2); items = g_completion_complete_utf8 (cmp, "a", NULL); g_assert (g_list_length (items) == 2); g_completion_free (cmp); return 0; }
static VALUE rg_add_items(VALUE self, VALUE items) { gint i, len; GList* list = (GList*)NULL; VALUE items_internal = rb_ivar_get(self, id_items_internal); items = rb_ary_to_ary(items); len = RARRAY_LEN(items); for (i = 0; i < len; i ++){ VALUE data = RARRAY_PTR(items)[i]; VALUE item = rb_assoc_new(self, data); list = g_list_append(list, (gpointer)item); rb_hash_aset(items_internal, data, item); } g_completion_add_items(_SELF(self), list); return self; }
static int key_action_tab_comp (GtkWidget *t, GdkEventKey *entry, char *d1, char *d2, struct session *sess) { int len = 0, elen = 0, i = 0, cursor_pos, ent_start = 0, comp = 0, prefix_len, skip_len = 0; gboolean is_nick = FALSE, is_cmd = FALSE, found = FALSE, has_nick_prefix = FALSE; char ent[CHANLEN], *postfix = NULL, *result, *ch; GList *list = NULL, *tmp_list = NULL; const char *text; GCompletion *gcomp = NULL; GString *buf; /* force the IM Context to reset */ SPELL_ENTRY_SET_EDITABLE (t, FALSE); SPELL_ENTRY_SET_EDITABLE (t, TRUE); text = SPELL_ENTRY_GET_TEXT (t); if (text[0] == 0) return 1; len = g_utf8_strlen (text, -1); /* must be null terminated */ cursor_pos = SPELL_ENTRY_GET_POS (t); /* handle "nick: " or "nick " or "#channel "*/ ch = g_utf8_find_prev_char(text, g_utf8_offset_to_pointer(text,cursor_pos)); if (ch && ch[0] == ' ') { skip_len++; ch = g_utf8_find_prev_char(text, ch); if (!ch) return 2; cursor_pos = g_utf8_pointer_to_offset(text, ch); if (cursor_pos && (g_utf8_get_char_validated(ch, -1) == ':' || g_utf8_get_char_validated(ch, -1) == ',' || g_utf8_get_char_validated (ch, -1) == g_utf8_get_char_validated (prefs.hex_completion_suffix, -1))) { skip_len++; } else cursor_pos = g_utf8_pointer_to_offset(text, g_utf8_offset_to_pointer(ch, 1)); } comp = skip_len; /* store the text following the cursor for reinsertion later */ if ((cursor_pos + skip_len) < len) postfix = g_utf8_offset_to_pointer(text, cursor_pos + skip_len); for (ent_start = cursor_pos; ; --ent_start) { if (ent_start == 0) break; ch = g_utf8_offset_to_pointer(text, ent_start - 1); if (ch && ch[0] == ' ') break; } if (ent_start == 0 && text[0] == prefs.hex_input_command_char[0]) { ent_start++; is_cmd = TRUE; } else if (strchr (sess->server->chantypes, text[ent_start]) == NULL) { is_nick = TRUE; if (strchr (sess->server->nick_prefixes, text[ent_start]) != NULL) { if (ent_start == 0) has_nick_prefix = TRUE; ent_start++; } } prefix_len = ent_start; elen = cursor_pos - ent_start; g_utf8_strncpy (ent, g_utf8_offset_to_pointer (text, prefix_len), elen); if (sess->type == SESS_DIALOG && is_nick) { /* tab in a dialog completes the other person's name */ if (rfc_ncasecmp (sess->channel, ent, elen) == 0) { result = sess->channel; is_nick = FALSE; } else return 2; } else { if (is_nick) { gcomp = g_completion_new((GCompletionFunc)gcomp_nick_func); tmp_list = userlist_double_list(sess); /* create a temp list so we can free the memory */ if (prefs.hex_completion_sort == 1) /* sort in last-talk order? */ tmp_list = g_list_sort (tmp_list, (void *)talked_recent_cmp); } else { gcomp = g_completion_new (NULL); if (is_cmd) { tmp_list = cmdlist_double_list (command_list); for(i = 0; xc_cmds[i].name != NULL ; i++) { tmp_list = g_list_prepend (tmp_list, xc_cmds[i].name); } tmp_list = plugin_command_list(tmp_list); } else tmp_list = chanlist_double_list (sess_list); } tmp_list = g_list_reverse(tmp_list); /* make the comp entries turn up in the right order */ g_completion_set_compare (gcomp, (GCompletionStrncmpFunc)rfc_ncasecmp); if (tmp_list) { g_completion_add_items (gcomp, tmp_list); g_list_free (tmp_list); } if (comp && !(rfc_ncasecmp(old_gcomp.data, ent, old_gcomp.elen) == 0)) { key_action_tab_clean (); comp = 0; } list = g_completion_complete_utf8 (gcomp, comp ? old_gcomp.data : ent, &result); if (result == NULL) /* No matches found */ { g_completion_free(gcomp); return 2; } if (comp) /* existing completion */ { while(list) /* find the current entry */ { if(rfc_ncasecmp(list->data, ent, elen) == 0) { found = TRUE; break; } list = list->next; } if (found) { if (!(d1 && d1[0])) /* not holding down shift */ { if (g_list_next(list) == NULL) list = g_list_first(list); else list = g_list_next(list); } else { if (g_list_previous(list) == NULL) list = g_list_last(list); else list = g_list_previous(list); } g_free(result); result = (char*)list->data; } else { g_free(result); g_completion_free(gcomp); return 2; } } else { strcpy(old_gcomp.data, ent); old_gcomp.elen = elen; /* Get the first nick and put out the data for future nickcompletes */ if (prefs.hex_completion_amount > 0 && g_list_length (list) <= (guint) prefs.hex_completion_amount) { g_free(result); result = (char*)list->data; } else { /* bash style completion */ if (g_list_next(list) != NULL) { buf = g_string_sized_new (MAX(COMP_BUF, len + NICKLEN)); if (strlen (result) > elen) /* the largest common prefix is larger than nick, change the data */ { if (prefix_len) g_string_append_len (buf, text, offset_to_len (text, prefix_len)); g_string_append (buf, result); cursor_pos = buf->len; g_free(result); if (postfix) { g_string_append_c (buf, ' '); g_string_append (buf, postfix); } SPELL_ENTRY_SET_TEXT (t, buf->str); SPELL_ENTRY_SET_POS (t, len_to_offset (buf->str, cursor_pos)); g_string_erase (buf, 0, -1); } else g_free(result); while (list) { len = buf->len; elen = strlen (list->data); /* next item to add */ if (len + elen + 2 >= COMP_BUF) /* +2 is space + null */ { PrintText (sess, buf->str); g_string_erase (buf, 0, -1); } g_string_append (buf, (char*)list->data); g_string_append_c (buf, ' '); list = list->next; } PrintText (sess, buf->str); g_completion_free(gcomp); g_string_free (buf, TRUE); return 2; } /* Only one matching entry */ g_free(result); result = list->data; } } } if(result) { buf = g_string_sized_new (len + NICKLEN); if (prefix_len) g_string_append_len (buf, text, offset_to_len (text, prefix_len)); g_string_append (buf, result); if((!prefix_len || has_nick_prefix) && is_nick && prefs.hex_completion_suffix[0] != '\0') g_string_append_unichar (buf, g_utf8_get_char_validated (prefs.hex_completion_suffix, -1)); g_string_append_c (buf, ' '); cursor_pos = buf->len; if (postfix) g_string_append (buf, postfix); SPELL_ENTRY_SET_TEXT (t, buf->str); SPELL_ENTRY_SET_POS (t, len_to_offset (buf->str, cursor_pos)); g_string_free (buf, TRUE); } if (gcomp) g_completion_free(gcomp); return 2; }
/* * cmdc() -- command completion function. * * cmdc takes a char* and returns a GList* of possible completions. * * Initial version by Travis Hume <*****@*****.**>. * */ static GList * cmdc( char *s ) { GCompletion *completion = NULL; GList *ret_list = NULL; static GHashTable *path_hash = NULL; static char *path = NULL; gchar *path_elem; struct stat buf; static gboolean inited = FALSE; gpointer hash_key = NULL; /* * Only want to build the GCompletion once. At some point I'd like to add * code to refresh the GCompletion, either at a regular interval, or when * there is a completion failure, ... * */ if(!inited) { /* Make a local copy of the path variable. Otherwise the path environment variable would be modified. */ path = (char *) malloc(sizeof(char) * (strlen(getenv("PATH")) + 1)); strcpy(path, getenv("PATH")); path_hash = g_hash_table_new( g_str_hash, g_str_equal ); for( path_elem = strtok( path, ":" ); path_elem; path_elem = strtok( NULL, ":" )) { if( stat( path_elem, &buf )) continue; if( buf.st_mode & S_IFDIR ) { /* keep a hash of processed paths, to avoid reprocessing * dupped path entries. */ hash_key = g_hash_table_lookup( path_hash, path_elem ); if( hash_key ) continue; /* duplicate $PATH entry */ else { g_hash_table_insert( path_hash, (gpointer)path_elem, (gpointer)path_elem ); process_dir( path_elem ); } } } /* atexit() we want to free the completion. */ g_atexit( cleanup ); inited = TRUE; } completion = g_completion_new( NULL ); g_completion_add_items( completion, path_elements ); ret_list = g_list_copy( g_completion_complete( completion, s, NULL )); g_completion_free( completion ); return g_list_sort( ret_list, (GCompareFunc)g_list_str_cmp ); }
static int key_action_tab_comp (GtkWidget *t, GdkEventKey *entry, char *d1, char *d2, struct session *sess) { int len = 0, elen = 0, i = 0, cursor_pos, ent_start = 0, comp = 0, found = 0, prefix_len, skip_len = 0, is_nick, is_cmd = 0; char buf[COMP_BUF], ent[CHANLEN], *postfix = NULL, *result, *ch; GList *list = NULL, *tmp_list = NULL; const char *text; GCompletion *gcomp = NULL; /* force the IM Context to reset */ SPELL_ENTRY_SET_EDITABLE (t, FALSE); SPELL_ENTRY_SET_EDITABLE (t, TRUE); text = SPELL_ENTRY_GET_TEXT (t); if (text[0] == 0) return 1; len = g_utf8_strlen (text, -1); /* must be null terminated */ cursor_pos = SPELL_ENTRY_GET_POS (t); buf[0] = 0; /* make sure we don't get garbage in the buffer */ /* handle "nick: " or "nick " or "#channel "*/ ch = g_utf8_find_prev_char(text, g_utf8_offset_to_pointer(text,cursor_pos)); if (ch && ch[0] == ' ') { skip_len++; ch = g_utf8_find_prev_char(text, ch); if (!ch) return 2; cursor_pos = g_utf8_pointer_to_offset(text, ch); if (cursor_pos && (g_utf8_get_char_validated(ch, -1) == ':' || g_utf8_get_char_validated(ch, -1) == ',' || g_utf8_get_char_validated(ch, -1) == prefs.nick_suffix[0])) { skip_len++; } else cursor_pos = g_utf8_pointer_to_offset(text, g_utf8_offset_to_pointer(ch, 1)); } comp = skip_len; /* store the text following the cursor for reinsertion later */ if ((cursor_pos + skip_len) < len) postfix = g_utf8_offset_to_pointer(text, cursor_pos + skip_len); for (ent_start = cursor_pos; ; --ent_start) { if (ent_start == 0) break; ch = g_utf8_offset_to_pointer(text, ent_start - 1); if (ch && ch[0] == ' ') break; } if (ent_start == 0 && text[0] == prefs.cmdchar[0]) { ent_start++; is_cmd = 1; } prefix_len = ent_start; elen = cursor_pos - ent_start; g_utf8_strncpy (ent, g_utf8_offset_to_pointer (text, prefix_len), elen); is_nick = (ent[0] == '#' || ent[0] == '&' || is_cmd) ? 0 : 1; if (sess->type == SESS_DIALOG && is_nick) { /* tab in a dialog completes the other person's name */ if (rfc_ncasecmp (sess->channel, ent, elen) == 0) { result = sess->channel; is_nick = 0; } else return 2; } else { if (is_nick) { gcomp = g_completion_new((GCompletionFunc)gcomp_nick_func); tmp_list = userlist_double_list(sess); /* create a temp list so we can free the memory */ if (prefs.completion_sort == 1) /* sort in last-talk order? */ tmp_list = g_list_sort (tmp_list, (void *)talked_recent_cmp); } else { gcomp = g_completion_new (NULL); if (is_cmd) { tmp_list = cmdlist_double_list (command_list); for(i = 0; xc_cmds[i].name != NULL ; i++) { tmp_list = g_list_prepend (tmp_list, xc_cmds[i].name); } tmp_list = plugin_command_list(tmp_list); } else tmp_list = chanlist_double_list (sess_list); } tmp_list = g_list_reverse(tmp_list); /* make the comp entries turn up in the right order */ g_completion_set_compare (gcomp, (GCompletionStrncmpFunc)rfc_ncasecmp); if (tmp_list) { g_completion_add_items (gcomp, tmp_list); g_list_free (tmp_list); } if (comp && !(rfc_ncasecmp(old_gcomp.data, ent, old_gcomp.elen) == 0)) { key_action_tab_clean (); comp = 0; } #if GLIB_CHECK_VERSION(2,4,0) list = g_completion_complete_utf8 (gcomp, comp ? old_gcomp.data : ent, &result); #else list = g_completion_complete (gcomp, comp ? old_gcomp.data : ent, &result); #endif if (result == NULL) /* No matches found */ { g_completion_free(gcomp); return 2; } if (comp) /* existing completion */ { while(list) /* find the current entry */ { if(rfc_ncasecmp(list->data, ent, elen) == 0) { found = 1; break; } list = list->next; } if (found) { if (!(d1 && d1[0])) /* not holding down shift */ { if (g_list_next(list) == NULL) list = g_list_first(list); else list = g_list_next(list); } else { if (g_list_previous(list) == NULL) list = g_list_last(list); else list = g_list_previous(list); } g_free(result); result = (char*)list->data; } else { g_free(result); g_completion_free(gcomp); return 2; } } else { strcpy(old_gcomp.data, ent); old_gcomp.elen = elen; /* Get the first nick and put out the data for future nickcompletes */ if (prefs.completion_amount && g_list_length (list) <= prefs.completion_amount) { g_free(result); result = (char*)list->data; } else { /* bash style completion */ if (g_list_next(list) != NULL) { if (strlen (result) > elen) /* the largest common prefix is larger than nick, change the data */ { if (prefix_len) g_utf8_strncpy (buf, text, prefix_len); strncat (buf, result, COMP_BUF - prefix_len); cursor_pos = strlen (buf); g_free(result); #if !GLIB_CHECK_VERSION(2,4,0) g_utf8_validate (buf, -1, (const gchar **)&result); (*result) = 0; #endif if (postfix) { strcat (buf, " "); strncat (buf, postfix, COMP_BUF - cursor_pos -1); } SPELL_ENTRY_SET_TEXT (t, buf); SPELL_ENTRY_SET_POS (t, g_utf8_pointer_to_offset(buf, buf + cursor_pos)); buf[0] = 0; } else g_free(result); while (list) { len = strlen (buf); /* current buffer */ elen = strlen (list->data); /* next item to add */ if (len + elen + 2 >= COMP_BUF) /* +2 is space + null */ { PrintText (sess, buf); buf[0] = 0; len = 0; } strcpy (buf + len, (char *) list->data); strcpy (buf + len + elen, " "); list = list->next; } PrintText (sess, buf); g_completion_free(gcomp); return 2; } /* Only one matching entry */ g_free(result); result = list->data; } } } if(result) { if (prefix_len) g_utf8_strncpy(buf, text, prefix_len); strncat (buf, result, COMP_BUF - (prefix_len + 3)); /* make sure nicksuffix and space fits */ if(!prefix_len && is_nick) strcat (buf, &prefs.nick_suffix[0]); strcat (buf, " "); cursor_pos = strlen (buf); if (postfix) strncat (buf, postfix, COMP_BUF - cursor_pos - 2); SPELL_ENTRY_SET_TEXT (t, buf); SPELL_ENTRY_SET_POS (t, g_utf8_pointer_to_offset(buf, buf + cursor_pos)); } if (gcomp) g_completion_free(gcomp); return 2; }
static int gtk_combo_entry_key_press (GtkEntry * entry, GdkEventKey * event, GtkCombo * combo) { GList *li; /* completion */ if ((event->keyval == GDK_Tab) && (event->state & GDK_MOD1_MASK)) { GCompletion * cmpl; gchar* prefix; gchar* nprefix = NULL; gint pos; if ( !GTK_LIST (combo->list)->children ) return FALSE; gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event"); cmpl = g_completion_new ((GCompletionFunc)gtk_combo_func); g_completion_add_items (cmpl, GTK_LIST (combo->list)->children); pos = GTK_EDITABLE (entry)->current_pos; prefix = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, pos); g_completion_complete(cmpl, prefix, &nprefix); if (nprefix && strlen (nprefix) > strlen (prefix)) { gtk_editable_insert_text (GTK_EDITABLE (entry), nprefix + pos, strlen (nprefix) - strlen (prefix), &pos); GTK_EDITABLE (entry)->current_pos = pos; } if (nprefix) g_free (nprefix); g_free (prefix); g_completion_free (cmpl); return TRUE; } if (!combo->use_arrows || !GTK_LIST (combo->list)->children) return FALSE; li = g_list_find (GTK_LIST (combo->list)->children, gtk_combo_find (combo)); if ((event->keyval == GDK_Up) || (event->keyval == GDK_KP_Up) || ((event->state & GDK_MOD1_MASK) && ((event->keyval == 'p') || (event->keyval == 'P')))) { if (li) li = li->prev; if (!li && combo->use_arrows_always) { li = g_list_last (GTK_LIST (combo->list)->children); } if (li) { gtk_list_select_child (GTK_LIST (combo->list), GTK_WIDGET (li->data)); gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event"); return TRUE; } } else if ((event->keyval == GDK_Down) || (event->keyval == GDK_KP_Down) || ((event->state & GDK_MOD1_MASK) && ((event->keyval == 'n') || (event->keyval == 'N')))) { if (li) li = li->next; if (!li && combo->use_arrows_always) { li = GTK_LIST (combo->list)->children; } if (li) { gtk_list_select_child (GTK_LIST (combo->list), GTK_WIDGET (li->data)); gtk_signal_emit_stop_by_name (GTK_OBJECT (entry), "key_press_event"); return TRUE; } } return FALSE; }
static void panel_run_dialog_update_completion (PanelRunDialog *dialog, const char *text) { GList *list; GList *executables; char prefix; char *buf; char *dirname; char *dirprefix; char *key; g_assert (text != NULL && *text != '\0' && !g_ascii_isspace (*text)); list = NULL; executables = NULL; if (!dialog->completion) { dialog->completion = g_completion_new (NULL); dialog->possible_executables = fill_possible_executables (); dialog->dir_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); } buf = g_path_get_basename (text); prefix = buf[0]; g_free (buf); if (prefix == '/' || prefix == '.') return; if (text [0] == '/') { /* complete against absolute path */ dirname = g_path_get_dirname (text); dirprefix = g_strdup (dirname); } else { /* complete against relative path and executable name */ if (!strchr (text, '/')) { executables = fill_executables (dialog->possible_executables, dialog->completion_items, text [0]); dirprefix = g_strdup (""); } else { dirprefix = g_path_get_dirname (text); } dirname = g_build_filename (g_get_home_dir (), dirprefix, NULL); } key = g_strdup_printf ("%s%c%c", dirprefix, G_DIR_SEPARATOR, prefix); if (!g_hash_table_lookup (dialog->dir_hash, key)) { g_hash_table_insert (dialog->dir_hash, key, dialog); list = fill_files_from (dirname, dirprefix, prefix, dialog->completion_items); } else { g_free (key); } list = g_list_concat (list, executables); g_free (dirname); g_free (dirprefix); if (list == NULL) return; g_completion_add_items (dialog->completion, list); dialog->completion_items = g_list_concat (dialog->completion_items, list); }