diff options
Diffstat (limited to 'src/completion.c')
-rw-r--r-- | src/completion.c | 1381 |
1 files changed, 747 insertions, 634 deletions
diff --git a/src/completion.c b/src/completion.c index 091419a4..c9df8223 100644 --- a/src/completion.c +++ b/src/completion.c @@ -38,587 +38,678 @@ static int m_command_len; /* GUI_FUNCTIONS {{{*/ /* completion_modify_completion_item(Completion *c, GdkColor *fg, GdkColor *bg, PangoFontDescription *fd) {{{*/ static void -completion_modify_completion_item(Completion *c, DwbColor *fg, DwbColor *bg, PangoFontDescription *fd) { - DWB_WIDGET_OVERRIDE_COLOR(c->llabel, GTK_STATE_NORMAL, fg); - DWB_WIDGET_OVERRIDE_COLOR(c->rlabel, GTK_STATE_NORMAL, fg); - DWB_WIDGET_OVERRIDE_COLOR(c->mlabel, GTK_STATE_NORMAL, fg); +completion_modify_completion_item(Completion *c, DwbColor *fg, DwbColor *bg, PangoFontDescription *fd) +{ + DWB_WIDGET_OVERRIDE_COLOR(c->llabel, GTK_STATE_NORMAL, fg); + DWB_WIDGET_OVERRIDE_COLOR(c->rlabel, GTK_STATE_NORMAL, fg); + DWB_WIDGET_OVERRIDE_COLOR(c->mlabel, GTK_STATE_NORMAL, fg); - DWB_WIDGET_OVERRIDE_BACKGROUND(c->event, GTK_STATE_NORMAL, bg); + DWB_WIDGET_OVERRIDE_BACKGROUND(c->event, GTK_STATE_NORMAL, bg); - DWB_WIDGET_OVERRIDE_FONT(c->llabel, dwb.font.fd_completion); - DWB_WIDGET_OVERRIDE_FONT(c->mlabel, dwb.font.fd_completion); - DWB_WIDGET_OVERRIDE_FONT(c->rlabel, dwb.font.fd_completion); + DWB_WIDGET_OVERRIDE_FONT(c->llabel, dwb.font.fd_completion); + DWB_WIDGET_OVERRIDE_FONT(c->mlabel, dwb.font.fd_completion); + DWB_WIDGET_OVERRIDE_FONT(c->rlabel, dwb.font.fd_completion); }/*}}}*/ /* completion_get_completion_item(Navigation *) return: Completion * {{{*/ static Completion * -completion_get_completion_item(const char *left, const char *right, const char *middle, void *data) { - Completion *c = g_malloc(sizeof(Completion)); - - c->llabel = gtk_label_new(left); - c->rlabel = gtk_label_new(right); - c->mlabel = gtk_label_new(middle); - c->event = gtk_event_box_new(); - c->data = data; - gboolean expand = middle != NULL && right != NULL; +completion_get_completion_item(const char *left, const char *right, const char *middle, void *data) +{ + Completion *c = g_malloc(sizeof(Completion)); + + c->llabel = gtk_label_new(left); + c->rlabel = gtk_label_new(right); + c->mlabel = gtk_label_new(middle); + c->event = gtk_event_box_new(); + c->data = data; + + gboolean expand = middle != NULL && right != NULL; #if _HAS_GTK3 - GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_set_homogeneous(GTK_BOX(hbox), expand); + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_set_homogeneous(GTK_BOX(hbox), expand); #else - GtkWidget *hbox = gtk_hbox_new(expand, 0); + GtkWidget *hbox = gtk_hbox_new(expand, 0); #endif - gtk_box_pack_start(GTK_BOX(hbox), c->llabel, true, true, 5); - gtk_box_pack_start(GTK_BOX(hbox), c->mlabel, middle != NULL, true, 5); - gtk_box_pack_start(GTK_BOX(hbox), c->rlabel, right != NULL, true, 5); + gtk_box_pack_start(GTK_BOX(hbox), c->llabel, true, true, 5); + gtk_box_pack_start(GTK_BOX(hbox), c->mlabel, middle != NULL, true, 5); + gtk_box_pack_start(GTK_BOX(hbox), c->rlabel, right != NULL, true, 5); - gtk_label_set_ellipsize(GTK_LABEL(c->llabel), PANGO_ELLIPSIZE_MIDDLE); - gtk_label_set_ellipsize(GTK_LABEL(c->rlabel), PANGO_ELLIPSIZE_MIDDLE); + gtk_label_set_ellipsize(GTK_LABEL(c->llabel), PANGO_ELLIPSIZE_MIDDLE); + gtk_label_set_ellipsize(GTK_LABEL(c->rlabel), PANGO_ELLIPSIZE_MIDDLE); - gtk_misc_set_alignment(GTK_MISC(c->llabel), 0.0, 0.5); - gtk_misc_set_alignment(GTK_MISC(c->mlabel), 1.0, 0.5); - gtk_misc_set_alignment(GTK_MISC(c->rlabel), 1.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(c->llabel), 0.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(c->mlabel), 1.0, 0.5); + gtk_misc_set_alignment(GTK_MISC(c->rlabel), 1.0, 0.5); - completion_modify_completion_item(c, &dwb.color.normal_c_fg, &dwb.color.normal_c_bg, dwb.font.fd_inactive); + completion_modify_completion_item(c, &dwb.color.normal_c_fg, &dwb.color.normal_c_bg, dwb.font.fd_inactive); - GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1, 1); - int padding = GET_INT("bars-padding"); - gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), padding, padding, padding, padding); - gtk_container_add(GTK_CONTAINER(alignment), hbox); - gtk_container_add(GTK_CONTAINER(c->event), alignment); + int padding = GET_INT("bars-padding"); + GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1, 1); + gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), padding, padding, padding, padding); + gtk_container_add(GTK_CONTAINER(alignment), hbox); + gtk_container_add(GTK_CONTAINER(c->event), alignment); - return c; + return c; }/*}}}*/ /* completion_init_completion {{{*/ static GList * -completion_init_completion(GList *store, GList *gl, gboolean word_beginnings, void *data, const char *value) { - Navigation *n; - const char *input = GET_TEXT(); - gboolean match; - char **token = NULL; - m_typed = g_strdup(input); - if (dwb.state.mode & COMMAND_MODE) - input = strchr(input, ' '); - if (input == NULL) - input = ""; - else - token = g_strsplit(input, " ", -1); - Match_Func func = word_beginnings ? (Match_Func)g_str_has_prefix : (Match_Func)util_strcasestr; - - - for (GList *l = gl; l; l=l->next) { - n = l->data; - match = false; - if (*input == 0) { - match = true; - } - else { - for (int i=0; token[i]; i++) { - if (func(n->first, token[i]) || (!word_beginnings && n->second && func(n->second, token[i]))) { - match = true; +completion_init_completion(GList *store, GList *gl, gboolean word_beginnings, void *data, const char *value) +{ + Navigation *n; + const char *input = GET_TEXT(); + gboolean match; + char **token = NULL; + m_typed = g_strdup(input); + if (dwb.state.mode & COMMAND_MODE) + input = strchr(input, ' '); + if (input == NULL) + input = ""; + else + token = g_strsplit(input, " ", -1); + Match_Func func = word_beginnings ? (Match_Func)g_str_has_prefix : (Match_Func)util_strcasestr; + + + for (GList *l = gl; l; l=l->next) + { + n = l->data; + match = false; + if (*input == 0) + match = true; + else + { + for (int i=0; token[i]; i++) + { + if (func(n->first, token[i]) || (!word_beginnings && n->second && func(n->second, token[i]))) + match = true; + else + { + match = false; + break; + } + } } - else { - match = false; - break; + if (match) + { + Completion *c = completion_get_completion_item(n->first, n->second, value, data); + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + store = g_list_append(store, c); } - } - } - if (match) { - Completion *c = completion_get_completion_item(n->first, n->second, value, data); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - store = g_list_append(store, c); } - } - g_strfreev(token); - return store; + g_strfreev(token); + return store; }/*}}}*/ /* dwb_completion_set_text(Completion *) {{{*/ void -completion_set_entry_text(Completion *c) { - const char *text; - int l; - CompletionType type = dwb_eval_completion_type(); - switch (type) { - case COMP_QUICKMARK: text = c->data; - break; - default: text = gtk_label_get_text(GTK_LABEL(c->llabel)); - break; - } - - if (dwb.state.mode & COMMAND_MODE && m_current_command) { - gtk_entry_set_text(GTK_ENTRY(dwb.gui.entry), m_current_command); - l = strlen(m_current_command); - gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), " ", -1, &l); - gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), text, -1, &l); - } - else { - char buf[7]; - gtk_editable_delete_text(GTK_EDITABLE(dwb.gui.entry), 0, -1); - if (dwb.state.nummod > -1) { - l = snprintf(buf, sizeof(buf), "%d", dwb.state.nummod); - gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), buf, -1, &l); - } - gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), text, -1, &l); - } - gtk_editable_set_position(GTK_EDITABLE(dwb.gui.entry), -1); +completion_set_entry_text(Completion *c) +{ + const char *text; + int l; + CompletionType type = dwb_eval_completion_type(); + switch (type) + { + case COMP_QUICKMARK: text = c->data; + break; + default: text = gtk_label_get_text(GTK_LABEL(c->llabel)); + break; + } + + if (dwb.state.mode & COMMAND_MODE && m_current_command) + { + gtk_entry_set_text(GTK_ENTRY(dwb.gui.entry), m_current_command); + l = strlen(m_current_command); + gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), " ", -1, &l); + gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), text, -1, &l); + } + else + { + char buf[7]; + gtk_editable_delete_text(GTK_EDITABLE(dwb.gui.entry), 0, -1); + if (dwb.state.nummod > -1) + { + l = snprintf(buf, sizeof(buf), "%d", dwb.state.nummod); + gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), buf, -1, &l); + } + gtk_editable_insert_text(GTK_EDITABLE(dwb.gui.entry), text, -1, &l); + } + gtk_editable_set_position(GTK_EDITABLE(dwb.gui.entry), -1); }/*}}}*/ /* completion_update_completion(GtkWidget *box, GList *comps, GList *active, int max, int back) Return *GList (Completions*){{{*/ static GList * -completion_update_completion(GtkWidget *box, GList *comps, GList *active, int max, int back) { - GList *old, *new; - Completion *c; - - int length = g_list_length(comps); - int items = MAX(length, max); - int r = (max) % 2; - int offset = max / 2 - 1 + r; - - old = active; - int position = g_list_position(comps, active) + 1; - if (!back) { - if (! (new = old->next) ) { - new = g_list_first(comps); - } - if (position > offset && position < items - offset - 1 + r) { - c = g_list_nth(comps, position - offset - 1)->data; - gtk_widget_hide(c->event); - c = g_list_nth(comps, position + offset + 1 - r)->data; - gtk_widget_show_all(c->event); - } - else { - if (position == items || position == 1) { - int i = 0; - for (GList *l = g_list_last(comps); l && i<max; l=l->prev) { - gtk_widget_hide(COMP_EVENT_BOX(l)); +completion_update_completion(GtkWidget *box, GList *comps, GList *active, int max, int back) +{ + GList *old, *new; + Completion *c; + + int length = g_list_length(comps); + int items = MAX(length, max); + int r = (max) % 2; + int offset = max / 2 - 1 + r; + + old = active; + int position = g_list_position(comps, active) + 1; + if (!back) + { + if (! (new = old->next) ) + new = g_list_first(comps); + + if (position > offset && position < items - offset - 1 + r) + { + c = g_list_nth(comps, position - offset - 1)->data; + gtk_widget_hide(c->event); + c = g_list_nth(comps, position + offset + 1 - r)->data; + gtk_widget_show_all(c->event); } - gtk_widget_show(box); - i = 0; - for (GList *l = g_list_first(comps); l && i<max ;l=l->next, i++) { - gtk_widget_show_all(((Completion*)l->data)->event); + else + { + if (position == items || position == 1) + { + int i = 0; + for (GList *l = g_list_last(comps); l && i<max; l=l->prev) + { + gtk_widget_hide(COMP_EVENT_BOX(l)); + } + gtk_widget_show(box); + i = 0; + for (GList *l = g_list_first(comps); l && i<max ;l=l->next, i++) + { + gtk_widget_show_all(((Completion*)l->data)->event); + } + } } - } - } - } - else { - if (! (new = old->prev) ) { - new = g_list_last(comps); - } - if (position -1> offset && position < items - offset + r) { - c = g_list_nth(comps, position - offset - 2)->data; - gtk_widget_show_all(c->event); - c = g_list_nth(comps, position + offset - r)->data; - gtk_widget_hide(c->event); - } - else { - if (position == 1) { - int i = 0; - for (GList *l = g_list_first(comps); l && i<max; l=l->next, i++) { - gtk_widget_hide(COMP_EVENT_BOX(l)); + } + else + { + if (! (new = old->prev) ) + new = g_list_last(comps); + + if (position -1> offset && position < items - offset + r) + { + c = g_list_nth(comps, position - offset - 2)->data; + gtk_widget_show_all(c->event); + c = g_list_nth(comps, position + offset - r)->data; + gtk_widget_hide(c->event); } - gtk_widget_show(box); - i = 0; - for (GList *l = g_list_last(comps); l && i<max ;l=l->prev, i++) { - c = l->data; - gtk_widget_show_all(c->event); + else + { + if (position == 1) + { + int i = 0; + for (GList *l = g_list_first(comps); l && i<max; l=l->next, i++) + { + gtk_widget_hide(COMP_EVENT_BOX(l)); + } + gtk_widget_show(box); + i = 0; + for (GList *l = g_list_last(comps); l && i<max ;l=l->prev, i++) + { + c = l->data; + gtk_widget_show_all(c->event); + } + } } - } - } - } - completion_modify_completion_item(old->data, &dwb.color.normal_c_fg, &dwb.color.normal_c_bg, dwb.font.fd_inactive); - completion_modify_completion_item(new->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); - active = new; - completion_set_entry_text(active->data); - return active; + } + completion_modify_completion_item(old->data, &dwb.color.normal_c_fg, &dwb.color.normal_c_bg, dwb.font.fd_inactive); + completion_modify_completion_item(new->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); + active = new; + completion_set_entry_text(active->data); + return active; }/*}}}*/ /*}}}*/ /* STANDARD_COMPLETION {{{*/ /* dwb_clean_completion() {{{*/ void -completion_clean_completion(gboolean set_text) { - for (GList *l = dwb.comps.completions; l; l=l->next) { - g_free(l->data); - } - g_list_free(dwb.comps.completions); - if (dwb.comps.view != NULL) - gtk_widget_destroy(dwb.gui.compbox); - dwb.comps.view = NULL; - dwb.comps.completions = NULL; - dwb.comps.active_comp = NULL; - if (set_text && m_typed != NULL) - entry_set_text(m_typed); - - FREE0(m_current_command); - m_command_len = 0; - - FREE0(m_typed); - - if (dwb.state.mode & COMPLETE_BUFFER) { - m_last_buf = 0; - m_leading0 = false; - dwb.state.mode &= ~COMPLETE_BUFFER; - dwb_change_mode(NORMAL_MODE, true); - } - else - dwb.state.mode &= ~(COMPLETION_MODE|COMPLETE_PATH); +completion_clean_completion(gboolean set_text) +{ + for (GList *l = dwb.comps.completions; l; l=l->next) + { + g_free(l->data); + } + g_list_free(dwb.comps.completions); + + if (dwb.comps.view != NULL) + gtk_widget_destroy(dwb.gui.compbox); + + dwb.comps.view = NULL; + dwb.comps.completions = NULL; + dwb.comps.active_comp = NULL; + if (set_text && m_typed != NULL) + entry_set_text(m_typed); + + FREE0(m_current_command); + m_command_len = 0; + + FREE0(m_typed); + + if (dwb.state.mode & COMPLETE_BUFFER) + { + m_last_buf = 0; + m_leading0 = false; + dwb.state.mode &= ~COMPLETE_BUFFER; + dwb_change_mode(NORMAL_MODE, true); + } + else + dwb.state.mode &= ~(COMPLETION_MODE|COMPLETE_PATH); }/*}}}*/ /* completion_show_completion(int back) {{{*/ static void -completion_show_completion(int back) { - int i=0; - if (back) { - dwb.comps.active_comp = g_list_last(dwb.comps.completions); - for (GList *l = dwb.comps.active_comp; l && i<dwb.misc.max_c_items; l=l->prev, i++) { - gtk_widget_show_all(((Completion*)l->data)->event); - } - } - else { - dwb.comps.active_comp = g_list_first(dwb.comps.completions); - for (GList *l = dwb.comps.active_comp; l && i<dwb.misc.max_c_items; l=l->next, i++) { - gtk_widget_show_all(((Completion*)l->data)->event); - } - } - if (dwb.comps.active_comp != NULL) { - completion_modify_completion_item(dwb.comps.active_comp->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); - completion_set_entry_text(dwb.comps.active_comp->data); - gtk_widget_show(dwb.gui.compbox); - } +completion_show_completion(int back) +{ + int i=0; + if (back) + { + dwb.comps.active_comp = g_list_last(dwb.comps.completions); + for (GList *l = dwb.comps.active_comp; l && i<dwb.misc.max_c_items; l=l->prev, i++) + { + gtk_widget_show_all(((Completion*)l->data)->event); + } + } + else + { + dwb.comps.active_comp = g_list_first(dwb.comps.completions); + for (GList *l = dwb.comps.active_comp; l && i<dwb.misc.max_c_items; l=l->next, i++) + { + gtk_widget_show_all(((Completion*)l->data)->event); + } + } + if (dwb.comps.active_comp != NULL) + { + completion_modify_completion_item(dwb.comps.active_comp->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); + completion_set_entry_text(dwb.comps.active_comp->data); + gtk_widget_show(dwb.gui.compbox); + } }/*}}}*/ /* dwb_completion_get_normal return: GList *Completions{{{*/ static GList * -completion_get_normal_completion() { - GList *list = NULL; - - if (!(dwb.state.mode & COMMAND_MODE) ) { - if (GET_BOOL("complete-userscripts")) - list = completion_init_completion(list, dwb.misc.userscripts, false, NULL, "Userscript"); - if (GET_BOOL("complete-searchengines")) - list = completion_init_completion(list, dwb.fc.se_completion, false, NULL, "Searchengine"); - } - if (GET_BOOL("complete-bookmarks")) - list = completion_init_completion(list, dwb.fc.bookmarks, false, NULL, "Bookmark"); - if (GET_BOOL("complete-history")) - list = completion_init_completion(list, dwb.fc.history, false, NULL, "History"); - - return list; +completion_get_normal_completion() +{ + GList *list = NULL; + + if (!(dwb.state.mode & COMMAND_MODE) ) + { + if (GET_BOOL("complete-userscripts")) + list = completion_init_completion(list, dwb.misc.userscripts, false, NULL, "Userscript"); + if (GET_BOOL("complete-searchengines")) + list = completion_init_completion(list, dwb.fc.se_completion, false, NULL, "Searchengine"); + } + if (GET_BOOL("complete-bookmarks")) + list = completion_init_completion(list, dwb.fc.bookmarks, false, NULL, "Bookmark"); + if (GET_BOOL("complete-history")) + list = completion_init_completion(list, dwb.fc.history, false, NULL, "History"); + + return list; }/*}}}*/ /* completion_get_simple_completion return: GList *Completions{{{*/ static GList * -completion_get_simple_completion(GList *gl) { - GList *list = NULL; - list = completion_init_completion(list, gl, false, NULL, NULL); - return list; +completion_get_simple_completion(GList *gl) +{ + GList *list = NULL; + list = completion_init_completion(list, gl, false, NULL, NULL); + return list; }/*}}}*/ /* dwb_completion_get_settings return: GList *Completions{{{*/ static GList * -completion_get_settings_completion() { - GList *l = g_hash_table_get_values(dwb.settings); - l = g_list_sort(l, (GCompareFunc)util_web_settings_sort_first); - const char *input = GET_TEXT(); - GList *list = NULL; - - for (; l; l=l->next) { - WebSettings *s = l->data; - Navigation n = s->n; - if (g_strrstr(n.first, input)) { - char *value = util_arg_to_char(&s->arg, s->type); - Completion *c = completion_get_completion_item(s->n.first, s->n.second, value, s); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - list = g_list_append(list, c); - } - } - if (l != NULL) - g_list_free(l); - return list; +completion_get_settings_completion() +{ + GList *l = g_hash_table_get_values(dwb.settings); + l = g_list_sort(l, (GCompareFunc)util_web_settings_sort_first); + const char *input = GET_TEXT(); + GList *list = NULL; + + for (; l; l=l->next) + { + WebSettings *s = l->data; + Navigation n = s->n; + if (g_strrstr(n.first, input)) + { + char *value = util_arg_to_char(&s->arg, s->type); + Completion *c = completion_get_completion_item(s->n.first, s->n.second, value, s); + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + list = g_list_append(list, c); + } + } + if (l != NULL) + g_list_free(l); + return list; }/*}}}*/ /* completion_create_key_completion(GList *l, const char *first, KeyMap *m) {{{*/ static GList * -completion_create_key_completion(GList *l, const char *first, KeyMap *m) { - char *mod = dwb_modmask_to_string(m->mod); - char *value = g_strdup_printf("%s %s", mod, m->key); - Completion *c = completion_get_completion_item(first, m->map->n.second, value, m); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - l = g_list_append(l, c); - g_free(value); - g_free(mod); - return l; +completion_create_key_completion(GList *l, const char *first, KeyMap *m) +{ + char *mod = dwb_modmask_to_string(m->mod); + char *value = g_strdup_printf("%s %s", mod, m->key); + Completion *c = completion_get_completion_item(first, m->map->n.second, value, m); + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + l = g_list_append(l, c); + g_free(value); + g_free(mod); + return l; }/*}}}*/ static GList * -completion_complete_scripts() { - GList *list = NULL; - for (GList *l = dwb.state.script_completion; l; l=l->next) { - Completion *c = completion_get_completion_item(((Navigation*)l->data)->first, ((Navigation*)l->data)->second, NULL, NULL); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - list = g_list_append(list, c); - } - dwb.state.mode = COMPLETE_SCRIPTS; - return list; +completion_complete_scripts() +{ + GList *list = NULL; + for (GList *l = dwb.state.script_completion; l; l=l->next) + { + Completion *c = completion_get_completion_item(((Navigation*)l->data)->first, ((Navigation*)l->data)->second, NULL, NULL); + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + list = g_list_append(list, c); + } + dwb.state.mode = COMPLETE_SCRIPTS; + return list; } /*dwb_completion_get_keys() return GList *Completions{{{*/ static GList * -completion_get_key_completion(gboolean entry) { - GList *list = NULL; - const char *input = GET_TEXT(); - - dwb.keymap = g_list_sort(dwb.keymap, (GCompareFunc)util_keymap_sort_first); - input = dwb_parse_nummod(input); - - /* check for aliases first */ - for (GList *l = dwb.keymap; l; l=l->next) { - KeyMap *m = l->data; - if (!entry && ((m->map->prop & CP_OVERRIDE_ENTRY) || !(m->map->prop & CP_COMMANDLINE))) { - continue; - } - if (!entry) { - for (int i=0; m->map->alias[i] != NULL; i++) { - if (g_str_has_prefix(m->map->alias[i], input) || !g_strcmp0(input, m->map->alias[i]) ) { - list = completion_create_key_completion(list, m->map->alias[i], m); - break; +completion_get_key_completion(gboolean entry) +{ + GList *list = NULL; + const char *input = GET_TEXT(); + + dwb.keymap = g_list_sort(dwb.keymap, (GCompareFunc)util_keymap_sort_first); + input = dwb_parse_nummod(input); + + /* check for aliases first */ + for (GList *l = dwb.keymap; l; l=l->next) + { + KeyMap *m = l->data; + if (!entry && ((m->map->prop & CP_OVERRIDE_ENTRY) || !(m->map->prop & CP_COMMANDLINE))) + continue; + + if (!entry) + { + for (int i=0; m->map->alias[i] != NULL; i++) + { + if (g_str_has_prefix(m->map->alias[i], input) || !g_strcmp0(input, m->map->alias[i]) ) + { + list = completion_create_key_completion(list, m->map->alias[i], m); + break; + } + } } - } } - } - /* check for long commands */ - for (GList *l = dwb.keymap; l; l=l->next) { - KeyMap *m = l->data; - if (!entry && ((m->map->prop & CP_OVERRIDE_ENTRY) || !(m->map->prop & CP_COMMANDLINE))) { - continue; + /* check for long commands */ + for (GList *l = dwb.keymap; l; l=l->next) + { + KeyMap *m = l->data; + if (!entry && ((m->map->prop & CP_OVERRIDE_ENTRY) || !(m->map->prop & CP_COMMANDLINE))) + continue; + + Navigation n = m->map->n; + if (g_str_has_prefix(n.first, input)) + list = completion_create_key_completion(list, n.first, m); } - Navigation n = m->map->n; - if (g_str_has_prefix(n.first, input)) { - list = completion_create_key_completion(list, n.first, m); - } - } - return list; + return list; }/*}}}*/ /* completion_path {{{*/ static void -completion_path(void) { - if (! (dwb.state.mode & DOWNLOAD_GET_PATH) ) - dwb.state.mode = COMPLETE_PATH; - completion_complete_path(false); +completion_path(void) +{ + if (! (dwb.state.mode & DOWNLOAD_GET_PATH) ) + dwb.state.mode = COMPLETE_PATH; + completion_complete_path(false); }/*}}}*/ /* completion_get_quickmarks {{{*/ static GList * -completion_get_quickmarks(int back) { - GList *list = NULL; - Quickmark *q; - char *escaped = NULL; - const char *input = GET_TEXT(); - m_typed = g_strdup(input); - for (GList *l = dwb.fc.quickmarks; l; l=l->next) { - q = l->data; - if (g_str_has_prefix(q->key, input)) { - Completion *c = completion_get_completion_item(NULL, q->nav->first, NULL, q->key); - escaped = g_markup_printf_escaped("%s\t\t<span style='italic'>%s</span>", q->key, q->nav->second); - if (escaped != NULL) { - gtk_label_set_markup(GTK_LABEL(c->llabel), escaped); - g_free(escaped); - } - else - gtk_label_set_text(GTK_LABEL(c->llabel), q->key); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - list = g_list_append(list, c); - } - } - if (back) - list = g_list_reverse(list); - return list; +completion_get_quickmarks(int back) +{ + GList *list = NULL; + Quickmark *q; + char *escaped = NULL; + const char *input = GET_TEXT(); + m_typed = g_strdup(input); + + for (GList *l = dwb.fc.quickmarks; l; l=l->next) + { + q = l->data; + if (g_str_has_prefix(q->key, input)) + { + Completion *c = completion_get_completion_item(NULL, q->nav->first, NULL, q->key); + escaped = g_markup_printf_escaped("%s\t\t<span style='italic'>%s</span>", q->key, q->nav->second); + if (escaped != NULL) + { + gtk_label_set_markup(GTK_LABEL(c->llabel), escaped); + g_free(escaped); + } + else + gtk_label_set_text(GTK_LABEL(c->llabel), q->key); + + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + list = g_list_append(list, c); + } + } + if (back) + list = g_list_reverse(list); + return list; }/*}}}*/ static void -completion_buffer_exec(GList *gl) { - completion_clean_completion(false); - dwb_focus_view(gl); - dwb_change_mode(NORMAL_MODE, true); +completion_buffer_exec(GList *gl) +{ + completion_clean_completion(false); + dwb_focus_view(gl); + dwb_change_mode(NORMAL_MODE, true); } #define COMPLETION_BUFFER_GET_PRIVATE(c) (((Completion*)((c)->data))->data) void -completion_buffer_key_press(GdkEventKey *e) { - if (DWB_TAB_KEY(e)) - completion_complete(COMP_BUFFER, e->state & GDK_SHIFT_MASK); - else if (DIGIT(e)) { - int value = e->keyval - GDK_KEY_0; - int length = g_list_length(dwb.state.views); - if (length < 10) { - if (value != 0 && value <= length) - completion_buffer_exec(g_list_nth(dwb.state.views, value-1)); - } - else { - m_last_buf = 10*m_last_buf + value; - if (m_last_buf > length) { - completion_clean_completion(false); - dwb_change_mode(NORMAL_MODE, true); - return; - } - if (m_last_buf != 0) { - if ((m_last_buf < 10 && m_leading0 == true) || m_last_buf >= 10) - completion_buffer_exec(g_list_nth(dwb.state.views, m_last_buf-1)); - } - else - m_leading0 = true; - } - } +completion_buffer_key_press(GdkEventKey *e) +{ + if (DWB_TAB_KEY(e)) + completion_complete(COMP_BUFFER, e->state & GDK_SHIFT_MASK); + else if (DIGIT(e)) { + int value = e->keyval - GDK_KEY_0; + int length = g_list_length(dwb.state.views); + if (length < 10) + { + if (value != 0 && value <= length) + completion_buffer_exec(g_list_nth(dwb.state.views, value-1)); + } + else + { + m_last_buf = 10*m_last_buf + value; + if (m_last_buf > length) { + completion_clean_completion(false); + dwb_change_mode(NORMAL_MODE, true); + return; + } + if (m_last_buf != 0) { + if ((m_last_buf < 10 && m_leading0 == true) || m_last_buf >= 10) + completion_buffer_exec(g_list_nth(dwb.state.views, m_last_buf-1)); + } + else + m_leading0 = true; + } + } } void -completion_eval_buffer_completion(void) { - /* TODO Wrong View is saved */ - GList *l = COMPLETION_BUFFER_GET_PRIVATE(dwb.comps.active_comp); - completion_buffer_exec(l); +completion_eval_buffer_completion(void) +{ + /* TODO Wrong View is saved */ + GList *l = COMPLETION_BUFFER_GET_PRIVATE(dwb.comps.active_comp); + completion_buffer_exec(l); } #undef COMPLETION_BUFFER_GET_PRIVATE /* completion_complete_buffer {{{*/ static GList * -completion_complete_buffer() { - GList *list = NULL; - int i=1; - const char *format = g_list_length(dwb.state.views) > 10 ? "%02d : %s" : "%d : %s"; - for (GList *l = dwb.state.views;l; l=l->next) { - WebKitWebView *wv = WEBVIEW(l); - const char *title = webkit_web_view_get_title(wv); - const char *uri = webkit_web_view_get_uri(wv); - char *text = g_strdup_printf(format, i, title != NULL ? title : uri); - Completion *c = completion_get_completion_item(text, uri, NULL, l); - g_free(text); - gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); - list = g_list_append(list, c); - i++; - } - if (list != NULL) { - dwb.state.mode = COMPLETE_BUFFER; - entry_focus(); - } - return list; +completion_complete_buffer() +{ + GList *list = NULL; + int i=1; + const char *uri, *title, *format; + char *text; + Completion *c; + WebKitWebView *wv; + + format = g_list_length(dwb.state.views) > 10 ? "%02d : %s" : "%d : %s"; + for (GList *l = dwb.state.views;l; l=l->next) + { + wv = WEBVIEW(l); + title = webkit_web_view_get_title(wv); + uri = webkit_web_view_get_uri(wv); + text = g_strdup_printf(format, i, title != NULL ? title : uri); + c = completion_get_completion_item(text, uri, NULL, l); + + gtk_box_pack_start(GTK_BOX(dwb.gui.compbox), c->event, false, false, 0); + list = g_list_append(list, c); + + g_free(text); + i++; + } + if (list != NULL) + { + dwb.state.mode = COMPLETE_BUFFER; + entry_focus(); + } + return list; }/*}}}*/ static gboolean -completion_command_line() { - KeyMap *km = NULL; - gboolean ret = false; - - const char *text = GET_TEXT(); - while (g_ascii_isspace(*text)) - text++; - char **token = g_strsplit(text, " ", 2); - const char *bak; - if (dwb.state.mode & COMMAND_MODE) { - for (GList *l = dwb.keymap; l; l=l->next) { - bak = token[0]; - km = l->data; - while (bak && (g_ascii_isspace(*bak) || g_ascii_isdigit(*bak))) - bak++; - if (! g_strcmp0(bak, km->map->n.first) && km->map->entry & EP_COMP_DEFAULT) { - ret = true; - break; - } - else { - for (int i=0; km->map->alias[i] != NULL; i++) { - if (! g_strcmp0(bak, km->map->alias[i]) && km->map->entry & EP_COMP_DEFAULT) { - ret = true; - break; - } +completion_command_line() +{ + KeyMap *km = NULL; + gboolean ret = false; + const char *bak, *text; + char **token; + + text = GET_TEXT(); + while (g_ascii_isspace(*text)) + text++; + token = g_strsplit(text, " ", 2); + if (dwb.state.mode & COMMAND_MODE) + { + for (GList *l = dwb.keymap; l; l=l->next) + { + bak = token[0]; + km = l->data; + + while (bak && (g_ascii_isspace(*bak) || g_ascii_isdigit(*bak))) + bak++; + + if (! g_strcmp0(bak, km->map->n.first) && km->map->entry & EP_COMP_DEFAULT) + { + ret = true; + break; + } + else + { + for (int i=0; km->map->alias[i] != NULL; i++) + { + if (! g_strcmp0(bak, km->map->alias[i]) && km->map->entry & EP_COMP_DEFAULT) + { + ret = true; + break; + } + } + if (ret) break; + } } - if (ret) break; - } - } - } - if (ret) { - m_command_len = util_strlen_trailing_space(text); - if ((m_command_len > 0 && g_ascii_isspace(text[m_command_len-1])) || token[1] != NULL) { - FREE0(m_current_command); - m_current_command = g_strdup(token[0]); - dwb.state.mode |= COMPLETE_COMMAND_MODE; - m_command_len++; } - else - ret = false; - } - g_strfreev(token); - return ret; + if (ret) + { + m_command_len = util_strlen_trailing_space(text); + if ((m_command_len > 0 && g_ascii_isspace(text[m_command_len-1])) || token[1] != NULL) + { + FREE0(m_current_command); + m_current_command = g_strdup(token[0]); + dwb.state.mode |= COMPLETE_COMMAND_MODE; + m_command_len++; + } + else + ret = false; + } + g_strfreev(token); + return ret; } /* completion_complete {{{*/ DwbStatus -completion_complete(CompletionType type, int back) { - DwbStatus ret = STATUS_OK; - if (dwb.state.mode & COMMAND_MODE) { - if (completion_command_line()) - type = COMP_NONE; - } - - dwb.state.mode &= ~(COMPLETE_PATH | AUTO_COMPLETE | COMPLETE_COMMAND_MODE); - if ( !(dwb.state.mode & COMPLETION_MODE) ) { +completion_complete(CompletionType type, int back) +{ + DwbStatus ret = STATUS_OK; + if (dwb.state.mode & COMMAND_MODE) + { + if (completion_command_line()) + type = COMP_NONE; + } + + dwb.state.mode &= ~(COMPLETE_PATH | AUTO_COMPLETE | COMPLETE_COMMAND_MODE); + if ( !(dwb.state.mode & COMPLETION_MODE) ) + { #if _HAS_GTK3 - dwb.gui.compbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_set_homogeneous(GTK_BOX(dwb.gui.compbox), true); + dwb.gui.compbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_box_set_homogeneous(GTK_BOX(dwb.gui.compbox), true); #else - dwb.gui.compbox = gtk_vbox_new(true, 0); + dwb.gui.compbox = gtk_vbox_new(true, 0); #endif - gtk_box_pack_start(GTK_BOX(dwb.gui.bottombox), dwb.gui.compbox, false, false, 0); - switch (type) { - case COMP_SETTINGS: dwb.comps.completions = completion_get_settings_completion(); break; - case COMP_KEY: dwb.comps.completions = completion_get_key_completion(true); break; - case COMP_COMMAND: dwb.comps.completions = completion_get_key_completion(false); break; - case COMP_BOOKMARK: dwb.comps.completions = completion_get_simple_completion(dwb.fc.bookmarks); break; - case COMP_HISTORY: dwb.comps.completions = completion_get_simple_completion(dwb.fc.history); break; - case COMP_USERSCRIPT: dwb.comps.completions = completion_get_simple_completion(dwb.misc.userscripts); break; - case COMP_SEARCH: dwb.comps.completions = completion_get_simple_completion(dwb.fc.se_completion); break; - case COMP_QUICKMARK: dwb.comps.completions = completion_get_quickmarks(back); break; - case COMP_PATH: completion_path(); return STATUS_OK; - case COMP_BUFFER: dwb.comps.completions = completion_complete_buffer(); break; - case COMP_SCRIPT: dwb.comps.completions = completion_complete_scripts(); break; - default: dwb.comps.completions = completion_get_normal_completion(); break; - } - if (!dwb.comps.completions) { - return STATUS_ERROR; - } - dwb.state.mode |= COMPLETION_MODE; - completion_show_completion(back); - dwb.comps.view = dwb.state.fview; - } - else if (dwb.comps.completions && dwb.comps.active_comp) { - dwb.comps.active_comp = completion_update_completion(dwb.gui.compbox, dwb.comps.completions, dwb.comps.active_comp, dwb.misc.max_c_items, back); - } - return ret; + gtk_box_pack_start(GTK_BOX(dwb.gui.bottombox), dwb.gui.compbox, false, false, 0); + switch (type) + { + case COMP_SETTINGS: dwb.comps.completions = completion_get_settings_completion(); break; + case COMP_KEY: dwb.comps.completions = completion_get_key_completion(true); break; + case COMP_COMMAND: dwb.comps.completions = completion_get_key_completion(false); break; + case COMP_BOOKMARK: dwb.comps.completions = completion_get_simple_completion(dwb.fc.bookmarks); break; + case COMP_HISTORY: dwb.comps.completions = completion_get_simple_completion(dwb.fc.history); break; + case COMP_USERSCRIPT: dwb.comps.completions = completion_get_simple_completion(dwb.misc.userscripts); break; + case COMP_SEARCH: dwb.comps.completions = completion_get_simple_completion(dwb.fc.se_completion); break; + case COMP_QUICKMARK: dwb.comps.completions = completion_get_quickmarks(back); break; + case COMP_PATH: completion_path(); return STATUS_OK; + case COMP_BUFFER: dwb.comps.completions = completion_complete_buffer(); break; + case COMP_SCRIPT: dwb.comps.completions = completion_complete_scripts(); break; + default: dwb.comps.completions = completion_get_normal_completion(); break; + } + if (!dwb.comps.completions) + return STATUS_ERROR; + + dwb.state.mode |= COMPLETION_MODE; + completion_show_completion(back); + dwb.comps.view = dwb.state.fview; + } + else if (dwb.comps.completions && dwb.comps.active_comp) + dwb.comps.active_comp = completion_update_completion(dwb.gui.compbox, dwb.comps.completions, dwb.comps.active_comp, dwb.misc.max_c_items, back); + + return ret; }/*}}}*/ /*}}}*/ /* AUTOCOMPLETION {{{*/ /*completion_eval_autocompletion{{{*/ void -completion_eval_autocompletion() { - Completion *c = dwb.comps.active_auto_c->data; - KeyMap *m = c->data; - dwb_change_mode(NORMAL_MODE, true); - commands_simple_command(m); +completion_eval_autocompletion() +{ + Completion *c = dwb.comps.active_auto_c->data; + KeyMap *m = c->data; + dwb_change_mode(NORMAL_MODE, true); + commands_simple_command(m); }/*}}}*/ /* dwb_set_autcompletion{{{*/ DwbStatus -completion_set_autcompletion(GList *l, WebSettings *s) { - dwb.comps.autocompletion = s->arg_local.b; - return STATUS_OK; +completion_set_autcompletion(GList *l, WebSettings *s) +{ + dwb.comps.autocompletion = s->arg_local.b; + return STATUS_OK; }/*}}}*/ /* completion_cleanautocompletion{{{*/ void -completion_clean_autocompletion() { - for (GList *l = dwb.comps.auto_c; l; l=l->next) { +completion_clean_autocompletion() +{ + for (GList *l = dwb.comps.auto_c; l; l=l->next) g_free(l->data); - } + g_list_free(dwb.comps.auto_c); gtk_widget_destroy(dwb.gui.autocompletion); dwb.comps.auto_c = NULL; @@ -635,212 +726,234 @@ completion_clean_autocompletion() { /* completion_init_autocompletion (GList *gl) return: GList * (Completion*){{{*/ static GList * -completion_init_autocompletion(GList *gl) { - GList *ret = NULL; - char buffer[128]; +completion_init_autocompletion(GList *gl) +{ + GList *ret = NULL; + char buffer[128]; + KeyMap *m; + Completion *c; #if _HAS_GTK3 - dwb.gui.autocompletion = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); - gtk_box_set_homogeneous(GTK_BOX(dwb.gui.autocompletion), true); + dwb.gui.autocompletion = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); + gtk_box_set_homogeneous(GTK_BOX(dwb.gui.autocompletion), true); #else - dwb.gui.autocompletion = gtk_hbox_new(true, 2); + dwb.gui.autocompletion = gtk_hbox_new(true, 2); #endif - int i=0; - for (GList *l=gl; l; l=l->next, i++) { - KeyMap *m = l->data; - if (! (m->map->prop & CP_OVERRIDE_ENTRY) ) { - snprintf(buffer, sizeof(buffer), "%s <span style='italic'>%s</span>", m->key, m->map->n.second); - Completion *c = completion_get_completion_item(NULL, NULL, NULL, m); - gtk_label_set_use_markup(GTK_LABEL(c->llabel), true); - gtk_label_set_markup(GTK_LABEL(c->llabel), buffer); - ret = g_list_append(ret, c); - if (i<5) { - gtk_widget_show_all(c->event); - } - gtk_box_pack_start(GTK_BOX(dwb.gui.autocompletion), c->event, true, true, 1); - } - } - gtk_box_pack_start(GTK_BOX(dwb.gui.status_hbox), dwb.gui.autocompletion, true, true, 10); - gtk_widget_hide(dwb.gui.entry); - gtk_widget_hide(dwb.gui.rstatus); - gtk_widget_hide(dwb.gui.urilabel); - gtk_widget_show(dwb.gui.autocompletion); - return ret; + int i=0; + for (GList *l=gl; l; l=l->next, i++) + { + m = l->data; + if (! (m->map->prop & CP_OVERRIDE_ENTRY) ) + { + snprintf(buffer, sizeof(buffer), "%s <span style='italic'>%s</span>", m->key, m->map->n.second); + c = completion_get_completion_item(NULL, NULL, NULL, m); + gtk_label_set_use_markup(GTK_LABEL(c->llabel), true); + gtk_label_set_markup(GTK_LABEL(c->llabel), buffer); + ret = g_list_append(ret, c); + if (i<5) { + gtk_widget_show_all(c->event); + } + gtk_box_pack_start(GTK_BOX(dwb.gui.autocompletion), c->event, true, true, 1); + } + } + gtk_box_pack_start(GTK_BOX(dwb.gui.status_hbox), dwb.gui.autocompletion, true, true, 10); + gtk_widget_hide(dwb.gui.entry); + gtk_widget_hide(dwb.gui.rstatus); + gtk_widget_hide(dwb.gui.urilabel); + gtk_widget_show(dwb.gui.autocompletion); + return ret; }/*}}}*/ /* dwb_autocomplete GList *gl(KeyMap*) GdkEventKey *{{{*/ void -completion_autocomplete(GList *gl, GdkEventKey *e) { - if (!dwb.comps.autocompletion) { - return; - } - if (! (dwb.state.mode & AUTO_COMPLETE) && gl) { - if (! gtk_widget_get_visible(dwb.gui.bottombox)) - gtk_widget_show(dwb.gui.bottombox); - dwb.state.mode |= AUTO_COMPLETE; - dwb.comps.auto_c = completion_init_autocompletion(gl); - dwb.comps.active_auto_c = g_list_first(dwb.comps.auto_c); - completion_modify_completion_item(dwb.comps.active_auto_c->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); - } - else if (e) { - dwb.comps.active_auto_c = completion_update_completion(dwb.gui.autocompletion, dwb.comps.auto_c, dwb.comps.active_auto_c, 5, e->state & GDK_SHIFT_MASK); - } +completion_autocomplete(GList *gl, GdkEventKey *e) +{ + if (!dwb.comps.autocompletion) + return; + + if (! (dwb.state.mode & AUTO_COMPLETE) && gl) + { + if (! gtk_widget_get_visible(dwb.gui.bottombox)) + gtk_widget_show(dwb.gui.bottombox); + + dwb.state.mode |= AUTO_COMPLETE; + dwb.comps.auto_c = completion_init_autocompletion(gl); + dwb.comps.active_auto_c = g_list_first(dwb.comps.auto_c); + completion_modify_completion_item(dwb.comps.active_auto_c->data, &dwb.color.active_c_fg, &dwb.color.active_c_bg, dwb.font.fd_active); + } + else if (e) + dwb.comps.active_auto_c = completion_update_completion(dwb.gui.autocompletion, dwb.comps.auto_c, dwb.comps.active_auto_c, 5, e->state & GDK_SHIFT_MASK); }/*}}}*/ /*}}}*/ /* PATHCOMPLETION {{{*/ /* completion_clean_path_completion {{{*/ void -completion_clean_path_completion() { - if (dwb.comps.path_completion) { - for (GList *l = g_list_first(dwb.comps.path_completion); l; l=l->next) { - char *data = l->data; - g_free(data); - } - g_list_free(dwb.comps.path_completion); - dwb.comps.path_completion = NULL; - dwb.comps.active_path = NULL; - } +completion_clean_path_completion() +{ + if (dwb.comps.path_completion) + { + for (GList *l = g_list_first(dwb.comps.path_completion); l; l=l->next) + { + char *data = l->data; + g_free(data); + } + g_list_free(dwb.comps.path_completion); + dwb.comps.path_completion = NULL; + dwb.comps.active_path = NULL; + } }/*}}}*/ /* completion_get_binaries(GList *list, char *text) return GList *{{{*/ static GList * -completion_get_binaries(GList *list, char *text) { - GDir *dir; - char **paths = g_strsplit(g_getenv("PATH"), ":", -1); - int i=0; - char *path; - const char *filename; - - while ( (path = paths[i++]) ) { - if ( (dir = g_dir_open(path, 'r', NULL)) ) { - while ( (filename = g_dir_read_name(dir))) { - if (g_str_has_prefix(filename, text)) { - list = g_list_prepend(list, g_strdup(filename)); +completion_get_binaries(GList *list, char *text) +{ + GDir *dir; + char **paths = g_strsplit(g_getenv("PATH"), ":", -1); + int i=0; + char *path; + const char *filename; + + while ( (path = paths[i++]) ) + { + if ( (dir = g_dir_open(path, 'r', NULL)) ) + { + while ( (filename = g_dir_read_name(dir))) + { + if (g_str_has_prefix(filename, text)) + list = g_list_prepend(list, g_strdup(filename)); + } + g_dir_close(dir); } - } - g_dir_close(dir); } - } - g_strfreev(paths); - return list; + g_strfreev(paths); + return list; }/* }}} */ static GList * -completion_get_path(GList *list, char *text) { - GDir *dir; - char d_tmp[PATH_MAX]; - const char *filename; - char path[PATH_MAX+1]; - char *store; - char *newpath; - gboolean prefix; - - if ( ( prefix = g_str_has_prefix(text, "file://")) ) - text += 7; - - g_strlcpy(d_tmp, text, PATH_MAX - 1); - char *d_name = dirname(d_tmp); - char *b_name = util_basename(text); - char *d_current = g_get_current_dir(); - if (! *text ) { - if (prefix) - list = g_list_prepend(list, g_strconcat("file://", d_current, "/", NULL)); - else - list = g_list_prepend(list, g_strconcat(d_current, "/", NULL)); - g_free(d_current); - return list; - } - else - g_free(d_current); - - if (!g_strcmp0(d_name, ".")) { - completion_complete(0, 0); - return NULL; - } - if (g_file_test(text, G_FILE_TEST_IS_DIR)) { - g_strlcpy(path, text, BUFFER_LENGTH - 1); - char path_last = path[strlen(path) - 1]; - if (path_last != '/' && path_last != '.') { - if (prefix) - return g_list_prepend(list, g_strconcat("file://", path, "/", NULL)); - else - return g_list_prepend(list, g_strconcat(path, "/", NULL)); - } - } - else if (g_file_test(d_name, G_FILE_TEST_IS_DIR)) { - g_strlcpy(path, d_name, BUFFER_LENGTH - 1); - } - if ( (dir = g_dir_open(path, 'r', NULL)) ) { - while ( (filename = g_dir_read_name(dir)) ) { - if ( ( !b_name && filename[0] != '.') || (b_name && g_str_has_prefix(filename, b_name))) { - newpath = g_build_filename(path, filename, NULL); +completion_get_path(GList *list, char *text) +{ + GDir *dir; + char d_tmp[PATH_MAX]; + const char *filename; + char path[PATH_MAX+1]; + char *store; + char *newpath; + gboolean prefix; + + if ( ( prefix = g_str_has_prefix(text, "file://")) ) + text += 7; + + g_strlcpy(d_tmp, text, PATH_MAX - 1); + char *d_name = dirname(d_tmp); + char *b_name = util_basename(text); + char *d_current = g_get_current_dir(); + if (! *text ) + { if (prefix) - store = g_strconcat("file://", newpath, "/" , NULL); - else - store = g_strconcat(newpath, "/" , NULL); - if (g_file_test(newpath, G_FILE_TEST_IS_DIR)) { - list = g_list_prepend(list, store); + list = g_list_prepend(list, g_strconcat("file://", d_current, "/", NULL)); + else + list = g_list_prepend(list, g_strconcat(d_current, "/", NULL)); + g_free(d_current); + return list; + } + else + g_free(d_current); + + if (!g_strcmp0(d_name, ".")) { + completion_complete(0, 0); + return NULL; + } + if (g_file_test(text, G_FILE_TEST_IS_DIR)) + { + g_strlcpy(path, text, BUFFER_LENGTH - 1); + char path_last = path[strlen(path) - 1]; + if (path_last != '/' && path_last != '.') { + if (prefix) + return g_list_prepend(list, g_strconcat("file://", path, "/", NULL)); + else + return g_list_prepend(list, g_strconcat(path, "/", NULL)); } - else { - g_free(store); + } + else if (g_file_test(d_name, G_FILE_TEST_IS_DIR)) { + g_strlcpy(path, d_name, BUFFER_LENGTH - 1); + } + if ( (dir = g_dir_open(path, 'r', NULL)) ) + { + while ( (filename = g_dir_read_name(dir)) ) + { + if ( ( !b_name && filename[0] != '.') || (b_name && g_str_has_prefix(filename, b_name))) + { + newpath = g_build_filename(path, filename, NULL); + + if (prefix) + store = g_strconcat("file://", newpath, "/" , NULL); + else + store = g_strconcat(newpath, "/" , NULL); + + if (g_file_test(newpath, G_FILE_TEST_IS_DIR)) + list = g_list_prepend(list, store); + else + g_free(store); + + g_free(newpath); + } } - g_free(newpath); - } + g_dir_close(dir); } - g_dir_close(dir); - } - return list; + return list; }/*}}}*/ /* completion_init_path_completion {{{*/ static void -completion_init_path_completion(int back) { - char *text = gtk_editable_get_chars(GTK_EDITABLE(dwb.gui.entry), 0, -1); - char expanded[PATH_MAX]; - text = util_expand_home(expanded, text, sizeof(expanded)); - - dwb.comps.path_completion = dwb.comps.active_path = g_list_append(NULL, g_strdup(text)); - if (dwb.state.dl_action == DL_ACTION_EXECUTE) { - GList *list = completion_get_binaries(NULL, text); - list = g_list_sort(list, (GCompareFunc)g_strcmp0); - dwb.comps.path_completion = g_list_concat(dwb.comps.path_completion, list); - } - else { - dwb.comps.path_completion = completion_get_path(dwb.comps.path_completion, text); - dwb.comps.path_completion = g_list_sort(dwb.comps.path_completion, (GCompareFunc)g_strcmp0); - } - if (g_list_length(dwb.comps.path_completion) == 1) { - completion_clean_path_completion(); - return; - } - if (dwb.comps.path_completion) { - if (back) { - dwb.comps.active_path = g_list_last(dwb.comps.path_completion); - } - else if (dwb.comps.path_completion->next) { - dwb.comps.active_path = dwb.comps.path_completion->next; - } - } +completion_init_path_completion(int back) +{ + char *text = gtk_editable_get_chars(GTK_EDITABLE(dwb.gui.entry), 0, -1); + char expanded[PATH_MAX]; + text = util_expand_home(expanded, text, sizeof(expanded)); + + dwb.comps.path_completion = dwb.comps.active_path = g_list_append(NULL, g_strdup(text)); + if (dwb.state.dl_action == DL_ACTION_EXECUTE) + { + GList *list = completion_get_binaries(NULL, text); + list = g_list_sort(list, (GCompareFunc)g_strcmp0); + dwb.comps.path_completion = g_list_concat(dwb.comps.path_completion, list); + } + else + { + dwb.comps.path_completion = completion_get_path(dwb.comps.path_completion, text); + dwb.comps.path_completion = g_list_sort(dwb.comps.path_completion, (GCompareFunc)g_strcmp0); + } + if (g_list_length(dwb.comps.path_completion) == 1) + { + completion_clean_path_completion(); + return; + } + if (dwb.comps.path_completion) + { + if (back) + dwb.comps.active_path = g_list_last(dwb.comps.path_completion); + else if (dwb.comps.path_completion->next) + dwb.comps.active_path = dwb.comps.path_completion->next; + } }/*}}}*/ /* completion_complete_download{{{*/ void -completion_complete_path(int back) { - if (! dwb.comps.path_completion ) { - completion_init_path_completion(0); - } - else if (back) { - if (dwb.comps.path_completion && dwb.comps.active_path && !(dwb.comps.active_path = dwb.comps.active_path->prev) ) { - dwb.comps.active_path = g_list_last(dwb.comps.path_completion); - } - } - else if (dwb.comps.active_path && !(dwb.comps.active_path = dwb.comps.active_path->next) ) { - dwb.comps.active_path = g_list_first(dwb.comps.path_completion); - } - if (dwb.comps.active_path && dwb.comps.active_path->data) { - entry_set_text(dwb.comps.active_path->data); - } +completion_complete_path(int back) +{ + if (! dwb.comps.path_completion ) + completion_init_path_completion(0); + else if (back) + { + if (dwb.comps.path_completion && dwb.comps.active_path && !(dwb.comps.active_path = dwb.comps.active_path->prev) ) + dwb.comps.active_path = g_list_last(dwb.comps.path_completion); + } + else if (dwb.comps.active_path && !(dwb.comps.active_path = dwb.comps.active_path->next) ) + dwb.comps.active_path = g_list_first(dwb.comps.path_completion); + + if (dwb.comps.active_path && dwb.comps.active_path->data) + entry_set_text(dwb.comps.active_path->data); }/*}}}*/ /*}}}*/ |