Exemplo n.º 1
0
void
newwindow(Client *c, const Arg *arg) {
	guint i = 0;
	const char *cmd[7], *uri;
	const Arg a = { .v = (void *)cmd };
	char tmp[64];

	cmd[i++] = progname;
	if(embed) {
		cmd[i++] = "-e";
		snprintf(tmp, LENGTH(tmp), "%u\n", (int)embed);
		cmd[i++] = tmp;
	}
	if(showxid) {
		cmd[i++] = "-x";
	}
	cmd[i++] = "--";
	uri = arg->v ? (char *)arg->v : c->linkhover;
	if(uri)
		cmd[i++] = uri;
	cmd[i++] = NULL;
	spawn(NULL, &a);
}

void
pasteuri(GtkClipboard *clipboard, const char *text, gpointer d) {
	Arg arg = {.v = text };
	if(text != NULL)
		loaduri((Client *) d, &arg);
}
Exemplo n.º 2
0
void
loadfile(Client *c, const gchar *f) {
	GIOChannel *chan = NULL;
	GError *e = NULL;
	GString *code;
	gchar *line, *uri;
	Arg arg;

	if(strcmp(f, "-") == 0) {
		chan = g_io_channel_unix_new(STDIN_FILENO);
		if (chan) {
			code = g_string_new("");
			while(g_io_channel_read_line(chan, &line, NULL, NULL,
						&e) == G_IO_STATUS_NORMAL) {
				g_string_append(code, line);
				g_free(line);
			}
			webkit_web_view_load_html_string(c->view, code->str,
					"file://.");
			g_io_channel_shutdown(chan, FALSE, NULL);
			g_string_free(code, TRUE);
		}
		arg.v = uri = g_strdup("stdin");
	}
	else {
		arg.v = uri = g_strdup_printf("file://%s", f);
		loaduri(c, &arg);
	}
	c->title = copystr(&c->title, uri);
	update(c);
	g_free(uri);
}
Exemplo n.º 3
0
Arquivo: surf.c Projeto: sr/surf
void
loadfile(const Client *c, const gchar *f) {
    GIOChannel *chan = NULL;
    GError *e = NULL;
    GString *code = g_string_new("");
    GString *uri = g_string_new(f);
    gchar *line;

    if(strcmp(f, "-") == 0) {
        chan = g_io_channel_unix_new(STDIN_FILENO);
        if (chan) {
            while(g_io_channel_read_line(chan, &line, NULL, NULL, &e) == G_IO_STATUS_NORMAL) {
                g_string_append(code, line);
                g_free(line);
            }
            webkit_web_view_load_html_string(c->view, code->str, NULL);
            g_io_channel_shutdown(chan, FALSE, NULL);
        }
    }
    else {
        g_string_prepend(uri, "file://");
        loaduri(c, uri->str);
    }

}
Exemplo n.º 4
0
Arquivo: surf.c Projeto: sr/surf
int main(int argc, char *argv[]) {
    gchar *uri = NULL, *file = NULL;
    SoupSession *s;
    Client *c;
    int o;
    const gchar *home, *filename;

    gtk_init(NULL, NULL);
    if (!g_thread_supported())
        g_thread_init(NULL);
    setup();
    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 LICENSE for details\n");
            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();

    /* cookie persistance */
    s = webkit_get_default_session();
    home = g_get_home_dir();
    filename = g_build_filename(home, ".surf-cookies", NULL);
    cookiejar = soup_cookie_jar_text_new(filename, FALSE);
    soup_session_add_feature(s, SOUP_SESSION_FEATURE(cookiejar));

    gtk_main();
    cleanup();
    return EXIT_SUCCESS;
}
Exemplo n.º 5
0
Arquivo: surf.c Projeto: sr/surf
GdkFilterReturn
processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
    XPropertyEvent *ev;
    Client *c = (Client *)d;
    Atom adummy;
    int idummy;
    unsigned long ldummy;
    unsigned char *buf = NULL;
    if(((XEvent *)e)->type == PropertyNotify) {
        ev = &((XEvent *)e)->xproperty;
        if(ignore_once == FALSE && ev->atom == urlprop && ev->state == PropertyNewValue) {
            XGetWindowProperty(dpy, ev->window, urlprop, 0L, BUFSIZ, False, XA_STRING,
                               &adummy, &idummy, &ldummy, &ldummy, &buf);
            loaduri(c, (gchar *)buf);
            XFree(buf);
            return GDK_FILTER_REMOVE;
        }
    }
    return GDK_FILTER_CONTINUE;
}
Exemplo n.º 6
0
GdkFilterReturn
processx(GdkXEvent *e, GdkEvent *event, gpointer d) {
	Client *c = (Client *)d;
	XPropertyEvent *ev;
	Arg arg;

	if(((XEvent *)e)->type == PropertyNotify) {
		ev = &((XEvent *)e)->xproperty;
		if(ev->state == PropertyNewValue) {
			if(ev->atom == atoms[AtomFind]) {
				arg.b = TRUE;
				find(c, &arg);
				return GDK_FILTER_REMOVE;
			}
			else if(ev->atom == atoms[AtomGo]) {
				arg.v = getatom(c, AtomGo);
				loaduri(c, &arg);
				return GDK_FILTER_REMOVE;
			}
		}
	}
	return GDK_FILTER_CONTINUE;
}
Exemplo n.º 7
0
int
main(int argc, char *argv[]) {
	Arg arg;
	Client *c;
	GdkGeometry hints = { 1, 1 };

	memset(&arg, 0, sizeof(arg));

	/* command line args */
	ARGBEGIN {
	case 'e':
		embed = strtol(EARGF(usage()), NULL, 0);
		break;
	case 'v':
		die("turf-"VERSION", ©2014 turf engineers, "
				"see LICENSE for details\n");
	case 'x':
		showxid = TRUE;
		break;
	default:
		usage();
	} ARGEND;
	if(argc > 0)
		arg.v = argv[0];

	sigchld(0);

	gtk_init(NULL, NULL);
	gtk_gl_init(NULL, NULL);

	dpy = GDK_DISPLAY();

	/* atoms */
	atoms[AtomFind] = XInternAtom(dpy, "_TURF_FIND", False);
	atoms[AtomGo] = XInternAtom(dpy, "_TURF_GO", False);
	atoms[AtomUri] = XInternAtom(dpy, "_TURF_URI", False);

	if(!(c = calloc(1, sizeof(Client))))
		die("Cannot malloc!\n");

	/* WIndow */
	if(embed) {
		c->win = gtk_plug_new(embed);
	} else {
		c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
		gtk_window_set_wmclass(GTK_WINDOW(c->win), "turf", "Turf");
		gtk_window_set_role(GTK_WINDOW(c->win), "Turf");
	}
	gtk_window_set_default_size(GTK_WINDOW(c->win), 800, 600);
	g_signal_connect(G_OBJECT(c->win),
			"destroy",
			G_CALLBACK(destroywin), c);

	c->vbox = gtk_vbox_new(FALSE, 0);

	/* cef init */
	cef_settings_t *settings;
	if(!(settings = malloc(sizeof(cef_settings_t))))
		die("Cannot malloc\n");

	cef_initialize(NULL, settings, NULL);

	/* cef set as child (vbox) */

	gtk_container_add(GTK_CONTAINER(c->win), c->vbox);


	gtk_widget_show_all(GTK_WIDGET(c->win));
	gtk_window_set_geometry_hints(GTK_WINDOW(c->win), NULL, &hints,
			GDK_HINT_MIN_SIZE);
	gdk_window_set_events(GTK_WIDGET(c->win)->window, GDK_ALL_EVENTS_MASK);
	/* process X events for window - aka AtomFind/AtomGo
	 * gdk_window_add_filter(GTK_WIDGET(c->win)->window, processx, c);
	 * setatom(c, AtomFind, "");
	 * setatom(c, AtomUri, "about:blank");
	 */

	c->title = NULL;
	c->next = clients;
	clients = c;

	if(showxid) {
		gdk_display_sync(gtk_widget_get_display(c->win));
		printf("%u\n",
			(guint)GDK_WINDOW_XID(GTK_WIDGET(c->win)->window));
		fflush(NULL);
		if (fclose(stdout) != 0) {
			die("Error closing stdout");
		}
	}

	if(arg.v)
		loaduri(clients, &arg);

	gtk_main();
	cleanup();

	return EXIT_SUCCESS;
}
Exemplo n.º 8
0
Arquivo: surf.c Projeto: sr/surf
gboolean
keypress(GtkWidget* w, GdkEventKey *ev, gpointer d) {
    Client *c = (Client *)d;

    if(ev->type != GDK_KEY_PRESS)
        return FALSE;
    if(GTK_WIDGET_HAS_FOCUS(c->searchbar)) {
        switch(ev->keyval) {
        case GDK_Escape:
            hidesearch(c);
            return TRUE;
        case GDK_Return:
            webkit_web_view_search_text(c->view,
                                        gtk_entry_get_text(GTK_ENTRY(c->searchbar)),
                                        FALSE,
                                        !(ev->state & GDK_SHIFT_MASK),
                                        TRUE);
            return TRUE;
        case GDK_Left:
        case GDK_Right:
        case GDK_r:
            return FALSE;
        }
    }
    else if(GTK_WIDGET_HAS_FOCUS(c->urlbar)) {
        switch(ev->keyval) {
        case GDK_Escape:
            hideurl(c);
            return TRUE;
        case GDK_Return:
            loaduri(c, gtk_entry_get_text(GTK_ENTRY(c->urlbar)));
            hideurl(c);
            return TRUE;
        case GDK_Left:
        case GDK_Right:
        case GDK_r:
            return FALSE;
        }
    }
    else if(ev->state == GDK_CONTROL_MASK || ev->state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) {
        switch(ev->keyval) {
        case GDK_r:
        case GDK_R:
            if((ev->state & GDK_SHIFT_MASK))
                webkit_web_view_reload_bypass_cache(c->view);
            else
                webkit_web_view_reload(c->view);
            return TRUE;
        case GDK_b:
            return TRUE;
        case GDK_g:
            showurl(c);
            return TRUE;
        case GDK_slash:
            showsearch(c);
            return TRUE;
        case GDK_Left:
            webkit_web_view_go_back(c->view);
            return TRUE;
        case GDK_Right:
            webkit_web_view_go_forward(c->view);
            return TRUE;
        }
    }
    else {
        switch(ev->keyval) {
        case GDK_k:
            webkit_web_view_move_cursor(c->view, GTK_MOVEMENT_DISPLAY_LINES, -1);
            return TRUE;
        case GDK_j:
            webkit_web_view_move_cursor(c->view, GTK_MOVEMENT_DISPLAY_LINES, 1);
            return TRUE;
        }
    }
    return FALSE;
}