diff -r 561d9db3aae4 surf.c --- a/surf.c Thu Sep 17 13:03:58 2009 +0200 +++ b/surf.c Wed Sep 23 13:47:38 2009 +0100 @@ -28,6 +28,8 @@ typedef struct Client { GtkWidget *win, *scroll, *vbox, *urlbar, *searchbar, *indicator; + GtkEntryCompletion *urlcomplete; + GtkListStore *completeliststore; WebKitWebView *view; WebKitDownload *download; gchar *title; @@ -81,6 +83,7 @@ static gboolean initdownload(WebKitWebView *view, WebKitDownload *o, Client *c); static gchar *geturi(Client *c); static void hidesearch(Client *c, const Arg *arg); +static void bkmarkurl(Client *c, const Arg *arg); static void hideurl(Client *c, const Arg *arg); static gboolean keypress(GtkWidget* w, GdkEventKey *ev, Client *c); static void linkhover(WebKitWebView* page, const gchar* t, const gchar* l, Client *c); @@ -348,6 +351,15 @@ g_free(uri); } +void bkmarkurl(Client *c, const Arg *arg) { + FILE *f; + gchar *currurl; + currurl = geturi(c); + f = g_fopen(g_strconcat(workdir,"/urls.txt",NULL),"a"); + fprintf(f,"%s\n",currurl); + fclose(f); +} + void loaduri(Client *c, const Arg *arg) { gchar *u; @@ -369,6 +381,20 @@ webkit_web_view_go_back_or_forward(c->view, steps); } +gboolean +matchfunc(GtkEntryCompletion *completion,const gchar *key,GtkTreeIter *iter,Client *c) +{ + gchar *matchval; + gtk_tree_model_get(GTK_TREE_MODEL(c->completeliststore),iter,0,&matchval,-1); + if (g_strrstr(matchval,key) != NULL) + { + return TRUE; + } + else + return FALSE; + g_free(matchval); +} + Client * newclient(void) { Client *c; @@ -414,6 +440,33 @@ gtk_entry_set_has_frame(GTK_ENTRY(c->urlbar), FALSE); g_signal_connect(G_OBJECT(c->urlbar), "focus-out-event", G_CALLBACK(unfocusbar), c); + /* completeliststore */ + c->completeliststore = gtk_list_store_new(1,G_TYPE_STRING); + GtkTreeIter iter; + int len = 0; + char buf[1024]; + FILE* urlf; + + if (( urlf = g_fopen(g_strconcat(workdir,"/urls.txt",NULL),"r"))) + { + while (fgets(buf,sizeof buf,urlf)) + { + len = strlen(buf); + if (buf[len - 1] == '\n') + buf[len - 1] = 0; + gtk_list_store_append(c->completeliststore,&iter); + gtk_list_store_set(c->completeliststore,&iter,0,buf,-1); + } + } + fclose(urlf); + + /* urlcomplete */ + c->urlcomplete = gtk_entry_completion_new(); + gtk_entry_completion_set_model(GTK_ENTRY_COMPLETION(c->urlcomplete),GTK_TREE_MODEL(c->completeliststore)); + gtk_entry_completion_set_text_column(GTK_ENTRY_COMPLETION(c->urlcomplete),0); + gtk_entry_completion_set_match_func(c->urlcomplete,(GtkEntryCompletionMatchFunc)matchfunc,c,g_free); + gtk_entry_set_completion(GTK_ENTRY(c->urlbar),GTK_ENTRY_COMPLETION(c->urlcomplete)); + /* searchbar */ c->searchbar = gtk_entry_new(); gtk_entry_set_has_frame(GTK_ENTRY(c->searchbar), FALSE); @@ -433,6 +486,10 @@ gtk_container_add(GTK_CONTAINER(c->vbox), c->urlbar); gtk_container_add(GTK_CONTAINER(c->vbox), c->indicator); + /* Hints */ + GdkGeometry hints = {1,1}; + gtk_window_set_geometry_hints(GTK_WINDOW(c->win),NULL,&hints,GDK_HINT_MIN_SIZE); + /* Setup */ gtk_box_set_child_packing(GTK_BOX(c->vbox), c->urlbar, FALSE, FALSE, 0, GTK_PACK_START); gtk_box_set_child_packing(GTK_BOX(c->vbox), c->searchbar, FALSE, FALSE, 0, GTK_PACK_START);