+scroll(Client *c, const Arg *arg) {
+ gdouble v;
+ GtkAdjustment *a;
+
+ a = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(c->scroll));
+ v = gtk_adjustment_get_value(a);
+ v += gtk_adjustment_get_step_increment(a) * arg->i;
+ v = MAX(v, 0.0);
+ v = MIN(v, gtk_adjustment_get_upper(a) - gtk_adjustment_get_page_size(a));
+ gtk_adjustment_set_value(a, v);
+}
+
+void
+request(SoupSession *s, SoupMessage *m, gpointer p) {
+ SoupCookieJar *cookies;
+ SoupMessageHeaders *h;
+ char *cookiestr;
+ soup_message_add_header_handler(m, "got-headers", "Set-Cookie",
+ G_CALLBACK(setcookie), NULL);
+
+ h = m->request_headers;
+ cookies = soup_cookie_jar_text_new(cookiefile, TRUE);
+ cookiestr = soup_cookie_jar_get_cookies(cookies, soup_message_get_uri(m), FALSE);
+ if(cookiestr)
+ soup_message_headers_append(h, "Cookie", cookiestr);
+ g_object_unref(cookies);
+}
+
+void
+setcookie(SoupMessage *m, gpointer p) {
+ SoupCookieJar *cookies;
+ SoupCookie *c;
+ SoupDate *e;
+ GSList *l;
+
+ cookies = soup_cookie_jar_text_new(cookiefile, FALSE);
+ for (l = soup_cookies_from_response(m); l; l = l->next){
+ c = (SoupCookie *)l->data;
+ if(c && c->expires == NULL) {
+ e = soup_date_new_from_time_t(time(NULL) + sessiontime);
+ c = soup_cookie_copy(c);
+ soup_cookie_set_expires(c, e);
+ }
+ soup_cookie_jar_add_cookie(cookies, c);
+ }
+ g_slist_free(l);
+ g_object_unref(cookies);
+}
+void
+sigchld(int unused) {
+ if(signal(SIGCHLD, sigchld) == SIG_ERR)
+ die("Can't install SIGCHLD handler");
+ while(0 < waitpid(-1, NULL, WNOHANG));