| tAdding search and urlbar. switching to getopt. - surf - customized build of su… | |
| git clone git://src.adamsgaard.dk/surf | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 37deb47b84ba1382fe8b217f6c08935e6c59a7cb | |
| parent 0e956be80f0717d4b298ceb275172e0ae722730c | |
| Author: Enno Boland (Gottox) <[email protected]> | |
| Date: Sat, 6 Jun 2009 16:30:11 +0200 | |
| Adding search and urlbar. switching to getopt. | |
| Diffstat: | |
| M surf.c | 155 ++++++++++++++++++++---------… | |
| 1 file changed, 99 insertions(+), 56 deletions(-) | |
| --- | |
| diff --git a/surf.c b/surf.c | |
| t@@ -10,28 +10,17 @@ | |
| #include <gdk/gdkkeysyms.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| +#include <getopt.h> | |
| #include <stdlib.h> | |
| #include <stdio.h> | |
| #include <webkit/webkit.h> | |
| #define LENGTH(x) (sizeof x / sizeof x[0]) | |
| -/* Plan9-style Argument parsing */ | |
| -/* Vars: _c -> count; _b -> break; _a -> argument */ | |
| -#define ARG int _c, _b; char *_a; \ | |
| - for(_c = 1; _c < argc && argv[_c][0] == '-' && argv[_c][1] && \ | |
| - (strcmp(argv[_c], "--") != 0); _c++) \ | |
| - for(_a = &argv[_c][1], _b = 0; !_b && *_a; _a++ ) \ | |
| - switch(*_a) | |
| -#define ARGVAL() (!_b && _a[1] && (_b = 1) ? &_a[1] : _c + 1 == argc ? \ | |
| - 0 : argv[++_c]) | |
| -#define ARGCHR() (*_a) | |
| -#define ARGC() _c | |
| Display *dpy; | |
| Atom urlprop; | |
| typedef struct Client { | |
| - GtkWidget *win; | |
| - GtkWidget *browser; | |
| + GtkWidget *win, *scroll, *vbox, *urlbar, *urllist, *searchbar; | |
| WebKitWebView *view; | |
| gchar *title; | |
| gint progress; | |
| t@@ -41,6 +30,8 @@ Client *clients = NULL; | |
| gboolean embed = FALSE; | |
| gboolean showxid = FALSE; | |
| gboolean ignore_once = FALSE; | |
| +extern char *optarg; | |
| +extern int optind; | |
| static Client *newclient(); | |
| static void die(char *str); | |
| t@@ -116,7 +107,8 @@ loadfile(const Client *c, const gchar *f) { | |
| } | |
| -static void loaduri(const Client *c, const gchar *uri) { | |
| +void | |
| +loaduri(const Client *c, const gchar *uri) { | |
| GString* u = g_string_new(uri); | |
| if(g_strrstr(u->str, ":") == NULL) | |
| g_string_prepend(u, "http://"); | |
| t@@ -134,11 +126,13 @@ gboolean | |
| newwindow(WebKitWebView *view, WebKitWebFrame *f, | |
| WebKitNetworkRequest *r, WebKitWebNavigationAction *n, | |
| WebKitWebPolicyDecision *p, gpointer d) { | |
| + /* TODO */ | |
| puts("new"); | |
| Client *c = newclient(); | |
| webkit_web_view_load_request(c->view, r); | |
| return TRUE; | |
| } | |
| + | |
| void | |
| linkhover(WebKitWebView* page, const gchar* t, const gchar* l, gpointer d) { | |
| Client *c = (Client *)d; | |
| t@@ -200,7 +194,13 @@ destroywin(GtkWidget* w, gpointer d) { | |
| void | |
| destroyclient(Client *c) { | |
| Client *p; | |
| + | |
| gtk_widget_destroy(c->win); | |
| + gtk_widget_destroy(c->scroll); | |
| + gtk_widget_destroy(c->vbox); | |
| + gtk_widget_destroy(c->urlbar); | |
| + gtk_widget_destroy(c->urllist); | |
| + gtk_widget_destroy(c->searchbar); | |
| if(clients == c && c->next == NULL) | |
| gtk_main_quit(); | |
| for(p = clients; p && p->next != c; p = p->next); | |
| t@@ -225,11 +225,15 @@ keypress(GtkWidget* w, GdkEventKey *ev, gpointer d) { | |
| else | |
| webkit_web_view_reload(c->view); | |
| return TRUE; | |
| + case GDK_b: | |
| + return TRUE; | |
| case GDK_g: | |
| - /* TODO */ | |
| + gtk_widget_hide(c->searchbar); | |
| + gtk_widget_show(c->urlbar); | |
| return TRUE; | |
| case GDK_slash: | |
| - /* TODO */ | |
| + gtk_widget_hide(c->urlbar); | |
| + gtk_widget_show(c->searchbar); | |
| return TRUE; | |
| case GDK_Left: | |
| webkit_web_view_go_back(c->view); | |
| t@@ -239,6 +243,11 @@ keypress(GtkWidget* w, GdkEventKey *ev, gpointer d) { | |
| return TRUE; | |
| } | |
| } | |
| + else if(ev->type == GDK_KEY_PRESS && ev->keyval == GDK_Escape) { | |
| + gtk_widget_hide(c->urlbar); | |
| + gtk_widget_hide(c->searchbar); | |
| + return TRUE; | |
| + } | |
| return FALSE; | |
| } | |
| t@@ -257,6 +266,7 @@ newclient(void) { | |
| Client *c; | |
| if(!(c = calloc(1, sizeof(Client)))) | |
| die("Cannot malloc!\n"); | |
| + /* Window */ | |
| if(embed) { | |
| c->win = gtk_plug_new(0); | |
| } | |
| t@@ -265,14 +275,19 @@ newclient(void) { | |
| gtk_window_set_wmclass(GTK_WINDOW(c->win), "surf", "surf"); | |
| } | |
| gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600); | |
| - c->browser = gtk_scrolled_window_new(NULL, NULL); | |
| - g_signal_connect (G_OBJECT(c->win), "destroy", G_CALLBACK(destroywin),… | |
| - g_signal_connect (G_OBJECT(c->win), "key-press-event", G_CALLBACK(keyp… | |
| + g_signal_connect(G_OBJECT(c->win), "destroy", G_CALLBACK(destroywin), … | |
| + g_signal_connect(G_OBJECT(c->win), "key-press-event", G_CALLBACK(keypr… | |
| - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->browser), | |
| + /* VBox */ | |
| + c->vbox = gtk_vbox_new(FALSE, 0); | |
| + | |
| + /* scrolled window */ | |
| + c->scroll = gtk_scrolled_window_new(NULL, NULL); | |
| + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(c->scroll), | |
| GTK_POLICY_NEVER, GTK_POLICY_NEVER); | |
| + | |
| + /* webview */ | |
| c->view = WEBKIT_WEB_VIEW(webkit_web_view_new()); | |
| - gtk_container_add(GTK_CONTAINER(c->browser), GTK_WIDGET(c->view)); | |
| g_signal_connect(G_OBJECT(c->view), "title-changed", G_CALLBACK(titlec… | |
| g_signal_connect(G_OBJECT(c->view), "load-progress-changed", G_CALLBAC… | |
| t@@ -281,55 +296,83 @@ newclient(void) { | |
| g_signal_connect(G_OBJECT(c->view), "new-window-policy-decision-reques… | |
| g_signal_connect(G_OBJECT(c->view), "download-requested", G_CALLBACK(d… | |
| - gtk_container_add(GTK_CONTAINER(c->win), c->browser); | |
| + /* urlbar */ | |
| + c->urlbar = gtk_entry_new(); | |
| + gtk_entry_set_has_frame(GTK_ENTRY(c->urlbar), FALSE); | |
| + | |
| + /* searchbar */ | |
| + c->searchbar = gtk_entry_new(); | |
| + gtk_entry_set_has_frame(GTK_ENTRY(c->searchbar), FALSE); | |
| + | |
| + /* Arranging */ | |
| + gtk_container_add(GTK_CONTAINER(c->scroll), GTK_WIDGET(c->view)); | |
| + gtk_container_add(GTK_CONTAINER(c->vbox), c->scroll); | |
| + gtk_container_add(GTK_CONTAINER(c->win), c->vbox); | |
| + gtk_container_add(GTK_CONTAINER(c->vbox), c->searchbar); | |
| + gtk_container_add(GTK_CONTAINER(c->vbox), c->urlbar); | |
| + | |
| + /* Setup */ | |
| + gtk_box_set_child_packing(GTK_BOX(c->vbox), c->urlbar, FALSE, FALSE, 0… | |
| + gtk_box_set_child_packing(GTK_BOX(c->vbox), c->searchbar, FALSE, FALSE… | |
| + gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE, TRUE, 0, … | |
| gtk_widget_grab_focus(GTK_WIDGET(c->view)); | |
| - gtk_widget_show_all(c->win); | |
| - if(showxid) | |
| - printf("%u\n", (unsigned int)GDK_WINDOW_XID(GTK_WIDGET(c->win)… | |
| - c->next = clients; | |
| - clients = c; | |
| + gtk_widget_hide_all(c->searchbar); | |
| + gtk_widget_hide_all(c->urlbar); | |
| + gtk_widget_show(c->vbox); | |
| + gtk_widget_show(c->scroll); | |
| + gtk_widget_show(GTK_WIDGET(c->view)); | |
| + gtk_widget_show(c->win); | |
| gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK); | |
| gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c); | |
| + c->next = clients; | |
| + clients = c; | |
| + if(showxid) | |
| + printf("%u\n", (unsigned int)GDK_WINDOW_XID(GTK_WIDGET(c->win)… | |
| return c; | |
| } | |
| int main(int argc, char *argv[]) { | |
| gchar *uri = NULL, *file = NULL; | |
| Client *c; | |
| + int o; | |
| gtk_init(NULL, NULL); | |
| if (!g_thread_supported()) | |
| g_thread_init(NULL); | |
| setup(); | |
| - ARG { | |
| - case 'x': | |
| - showxid = TRUE; | |
| - break; | |
| - case 'e': | |
| - showxid = TRUE; | |
| - embed = TRUE; | |
| - break; | |
| - case 'u': | |
| - if(!(uri = ARGVAL())) | |
| - goto argerr; | |
| - c = newclient(); | |
| - loaduri(c, uri); | |
| - updatetitle(c); | |
| - break; | |
| - case 'f': | |
| - if(!(file = ARGVAL())) | |
| - goto argerr; | |
| - c = newclient(); | |
| - loadfile(c, file); | |
| - updatetitle(c); | |
| - break; | |
| - argerr: | |
| - default: | |
| - puts("surf - simple browser"); | |
| - printf("usage: %s [-e] [-x] [-u uri] [-f file]\n", argv[0]); | |
| - return EXIT_FAILURE; | |
| - } | |
| - if(argc != ARGC()) | |
| + while((o = getopt(argc, argv, "vhxeu:f:")) != -1) | |
| + switch(o) { | |
| + case 'x': | |
| + showxid = TRUE; | |
| + break; | |
| + case 'e': | |
| + showxid = TRUE; | |
| + embed = TRUE; | |
| + break; | |
| + case 'u': | |
| + if(!(uri = optarg)) | |
| + goto argerr; | |
| + c = newclient(); | |
| + loaduri(c, uri); | |
| + updatetitle(c); | |
| + break; | |
| + case 'f': | |
| + if(!(file = optarg)) | |
| + goto argerr; | |
| + c = newclient(); | |
| + loadfile(c, file); | |
| + updatetitle(c); | |
| + break; | |
| + case 'v': | |
| + die("surf-"VERSION", © 2009 surf engineers, see LICEN… | |
| + break; | |
| + argerr: | |
| + default: | |
| + puts("surf - simple browser"); | |
| + die("usage: surf [-e] [-x] [-u uri] [-f file]\n"); | |
| + return EXIT_FAILURE; | |
| + } | |
| + if(optind != argc) | |
| goto argerr; | |
| if(!clients) | |
| newclient(); |