char *argv0;
#define LENGTH(x) (sizeof x / sizeof x[0])
+#define CLEANMASK(mask) (mask & (MODKEY|GDK_SHIFT_MASK))
#define COOKIEJAR_TYPE (cookiejar_get_type ())
#define COOKIEJAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), COOKIEJAR_TYPE, CookieJar))
};
typedef struct Client {
- GtkWidget *win, *scroll, *vbox, *indicator;
+ GtkWidget *win, *scroll, *vbox, *pane;
WebKitWebView *view;
WebKitWebInspector *inspector;
char *title, *linkhover;
const char *uri, *needle;
gint progress;
struct Client *next;
- gboolean zoomed, fullscreen, isinspector, sslfailed;
+ gboolean zoomed, fullscreen, isinspecting, sslfailed;
} Client;
typedef struct {
static char winid[64];
static gboolean usingproxy = 0;
static char togglestat[5];
+static char pagestat[2];
static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
WebKitWebResource *r, WebKitNetworkRequest *req,
static void destroyclient(Client *c);
static void destroywin(GtkWidget* w, Client *c);
static void die(const char *errstr, ...);
-static void drawindicator(Client *c);
static void eval(Client *c, const Arg *arg);
-static gboolean exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c);
static void find(Client *c, const Arg *arg);
static void fullscreen(Client *c, const Arg *arg);
static const char *getatom(Client *c, int a);
static void gettogglestat(Client *c);
+static void getpagestat(Client *c);
static char *geturi(Client *c);
static gboolean initdownload(WebKitWebView *v, WebKitDownload *o, Client *c);
Client *p;
webkit_web_view_stop_loading(c->view);
- gtk_widget_destroy(c->indicator);
gtk_widget_destroy(GTK_WIDGET(c->view));
gtk_widget_destroy(c->scroll);
gtk_widget_destroy(c->vbox);
exit(EXIT_FAILURE);
}
-static void
-drawindicator(Client *c) {
- gint width;
- const char *uri;
- char *colorname;
- GtkWidget *w;
- GdkGC *gc;
- GdkColor fg;
-
- uri = geturi(c);
- w = c->indicator;
- width = c->progress * w->allocation.width / 100;
- gc = gdk_gc_new(w->window);
- if(strstr(uri, "https://") == uri) {
- if(usingproxy) {
- colorname = c->sslfailed? progress_proxy_untrust :
- progress_proxy_trust;
- } else {
- colorname = c->sslfailed? progress_untrust :
- progress_trust;
- }
- } else {
- if(usingproxy) {
- colorname = progress_proxy;
- } else {
- colorname = progress;
- }
- }
-
- gdk_color_parse(colorname, &fg);
- gdk_gc_set_rgb_fg_color(gc, &fg);
- gdk_draw_rectangle(w->window,
- w->style->bg_gc[GTK_WIDGET_STATE(w)],
- TRUE, 0, 0, w->allocation.width, w->allocation.height);
- gdk_draw_rectangle(w->window, gc, TRUE, 0, 0, width,
- w->allocation.height);
- g_object_unref(gc);
-}
-
-static gboolean
-exposeindicator(GtkWidget *w, GdkEventExpose *e, Client *c) {
- drawindicator(c);
- return TRUE;
-}
-
static void
find(Client *c, const Arg *arg) {
const char *s;
static void
inspector(Client *c, const Arg *arg) {
- if(c->isinspector)
- return;
- webkit_web_inspector_show(c->inspector);
+ if(c->isinspecting) {
+ webkit_web_inspector_close(c->inspector);
+ } else {
+ webkit_web_inspector_show(c->inspector);
+ }
}
static WebKitWebView *
inspector_new(WebKitWebInspector *i, WebKitWebView *v, Client *c) {
- Client *n = newclient();
- n->isinspector = true;
-
- return n->view;
+ return WEBKIT_WEB_VIEW(webkit_web_view_new());
}
static gboolean
inspector_show(WebKitWebInspector *i, Client *c) {
- gtk_widget_show(GTK_WIDGET(webkit_web_inspector_get_web_view(i)));
+ WebKitWebView *w;
+
+ if(c->isinspecting)
+ return false;
+
+ w = webkit_web_inspector_get_web_view(i);
+ gtk_paned_pack2(GTK_PANED(c->pane), GTK_WIDGET(w), TRUE, TRUE);
+ gtk_widget_show(GTK_WIDGET(w));
+ c->isinspecting = true;
+
return true;
}
static gboolean
inspector_close(WebKitWebInspector *i, Client *c) {
- gtk_widget_hide(GTK_WIDGET(webkit_web_inspector_get_web_view(i)));
+ GtkWidget *w;
+
+ if(!c->isinspecting)
+ return false;
+
+ w = GTK_WIDGET(webkit_web_inspector_get_web_view(i));
+ gtk_widget_hide(w);
+ gtk_widget_destroy(w);
+ c->isinspecting = false;
+
return true;
}
updatewinid(c);
for(i = 0; i < LENGTH(keys); i++) {
if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval
- && (ev->state & keys[i].mod) == keys[i].mod
+ && CLEANMASK(ev->state) == keys[i].mod
&& keys[i].func) {
keys[i].func(c, &(keys[i].arg));
processed = TRUE;
"key-press-event",
G_CALLBACK(keypress), c);
+ /* Pane */
+ c->pane = gtk_vpaned_new();
+
/* VBox */
c->vbox = gtk_vbox_new(FALSE, 0);
+ gtk_paned_pack1(GTK_PANED(c->pane), c->vbox, TRUE, TRUE);
/* Scrolled Window */
c->scroll = gtk_scrolled_window_new(NULL, NULL);
"resource-request-starting",
G_CALLBACK(beforerequest), c);
- /* Indicator */
- c->indicator = gtk_drawing_area_new();
- gtk_widget_set_size_request(c->indicator, 0, indicator_thickness);
- g_signal_connect (G_OBJECT (c->indicator), "expose_event",
- G_CALLBACK (exposeindicator), c);
-
/* Arranging */
gtk_container_add(GTK_CONTAINER(c->scroll), GTK_WIDGET(c->view));
- gtk_container_add(GTK_CONTAINER(c->win), c->vbox);
+ gtk_container_add(GTK_CONTAINER(c->win), c->pane);
gtk_container_add(GTK_CONTAINER(c->vbox), c->scroll);
- gtk_container_add(GTK_CONTAINER(c->vbox), c->indicator);
/* Setup */
- gtk_box_set_child_packing(GTK_BOX(c->vbox), c->indicator, FALSE,
- FALSE, 0, GTK_PACK_START);
gtk_box_set_child_packing(GTK_BOX(c->vbox), c->scroll, TRUE,
TRUE, 0, GTK_PACK_START);
gtk_widget_grab_focus(GTK_WIDGET(c->view));
+ gtk_widget_show(c->pane);
gtk_widget_show(c->vbox);
gtk_widget_show(c->scroll);
gtk_widget_show(GTK_WIDGET(c->view));
G_CALLBACK(inspector_close), c);
g_signal_connect(G_OBJECT(c->inspector), "finished",
G_CALLBACK(inspector_finished), c);
- c->isinspector = false;
+ c->isinspecting = false;
}
g_free(uri);
c->title = NULL;
c->next = clients;
clients = c;
+
if(showxid) {
gdk_display_sync(gtk_widget_get_display(c->win));
printf("%u\n",
die("Error closing stdout");
}
}
+
return c;
}
/* clean up any zombies immediately */
sigchld(0);
gtk_init(NULL, NULL);
- if (!g_thread_supported())
- g_thread_init(NULL);
dpy = GDK_DISPLAY();
togglestat[4] = '\0';
}
+static void
+getpagestat(Client *c) {
+ pagestat[0] = c->sslfailed ? 'U' : 'T';
+ pagestat[1] = usingproxy ? 'P' : '-';
+}
static void
update(Client *c) {
char *t;
gettogglestat(c);
+ getpagestat(c);
if(c->linkhover) {
- t = g_strdup_printf("%s| %s", togglestat, c->linkhover);
+ t = g_strdup_printf("%s:%s | %s", togglestat, pagestat, c->linkhover);
} else if(c->progress != 100) {
- drawindicator(c);
- gtk_widget_show(c->indicator);
- t = g_strdup_printf("[%i%%] %s| %s", c->progress, togglestat,
- c->title);
+ t = g_strdup_printf("[%i%%] %s:%s | %s", c->progress, togglestat,
+ pagestat, c->title);
} else {
- gtk_widget_hide_all(c->indicator);
- t = g_strdup_printf("%s| %s", togglestat, c->title);
+ t = g_strdup_printf("%s:%s | %s", togglestat, pagestat, c->title);
}
gtk_window_set_title(GTK_WINDOW(c->win), t);