X-Git-Url: https://git.armaanb.net/?a=blobdiff_plain;f=browser.c;h=1d31c9e71c82d92f7d841fd249b69235bf68b528;hb=9072abf0ae249c6903cb5966f2d64960b51d25cb;hp=f8d50dfaee89c04977d6a6e4d4b1e443f55e4d18;hpb=a682737372af005d3be78248296680f131e39858;p=chorizo.git diff --git a/browser.c b/browser.c index f8d50df..1d31c9e 100644 --- a/browser.c +++ b/browser.c @@ -6,62 +6,11 @@ #include #include "config.h" -#include "downloads.h" - -WebKitWebView *client_new_request(WebKitWebView *, WebKitNavigationAction *, - gpointer); -gboolean crashed_web_view(WebKitWebView *, gpointer); -gboolean decide_policy(WebKitWebView *, WebKitPolicyDecision *, - WebKitPolicyDecisionType, gpointer); -gboolean key_location(GtkWidget *, GdkEvent *, gpointer); -gboolean key_tablabel(GtkWidget *, GdkEvent *, gpointer); -gboolean key_web_view(GtkWidget *, GdkEvent *, gpointer); -gboolean key_common(GtkWidget *, GdkEvent *, gpointer); -gboolean key_wsearch(GtkWidget *, GdkEvent *, gpointer); -gboolean key_isearch(GtkWidget *, GdkEvent *, gpointer); -gboolean isearch_counted_matches(GtkWidget *, guint, gpointer); -gboolean remote_msg(GIOChannel *, GIOCondition, gpointer); -gchar *ensure_uri_scheme(const gchar *); -void changed_favicon(GObject *, GParamSpec *, gpointer); -void changed_load_progress(GObject *, GParamSpec *, gpointer); -void changed_title(GObject *, GParamSpec *, gpointer); -void changed_uri(GObject *, GParamSpec *, gpointer); -void grab_feeds_finished(GObject *, GAsyncResult *, gpointer); -void hover_web_view(WebKitWebView *, WebKitHitTestResult *, guint, gpointer); -void icon_location(GtkEntry *, GtkEntryIconPosition, GdkEvent *, gpointer); -void mainwindow_title(gint); -void notebook_switch_page(GtkNotebook *, GtkWidget *, guint, gpointer); -void show_web_view(WebKitWebView *, gpointer); -void trust_user_certs(WebKitWebContext *); - -struct Client { - GtkWidget *location; - GtkWidget *wsearch; - GtkWidget *isearch; - GtkWidget *isearch_box; - GtkWidget *isearch_matches; - GtkWidget *tabicon; - GtkWidget *tablabel; - GtkWidget *vbox; - GtkWidget *web_view; - WebKitSettings *settings; - gboolean focus_new_tab; - gchar *external_handler_uri; - gchar *feed_html; - gchar *hover_uri; -}; - -struct MainWindow { - GtkWidget *notebook; - GtkWidget *win; -} mw; - -struct Configuration { - gboolean cooperative_alone; - gboolean noncooperative_instances; - gboolean private; - gboolean verbose; -} cfg; +#include "chorizo.h" + +struct MainWindow mw; +struct Configuration cfg; +gboolean switch_tab; gint clients = 0; @@ -70,6 +19,43 @@ gchar *fifopath; char **closed_tabs; size_t num_closed = 0; +gboolean +isearch_counted_matches(GtkWidget *widget, guint matches, gpointer data) +{ + struct Client *c = (struct Client *)data; + char *text = malloc(12); + sprintf(text, "%d matches", matches); + gtk_label_set_text(GTK_LABEL(c->isearch_matches), text); + free(text); + return TRUE; +} + +gboolean +quit_if_nothing_active(void) +{ + if (clients == 0) { + if (downloads == 0) { + gtk_main_quit(); + return TRUE; + } else { + downloadmanager_show(); + } + } + return FALSE; +} +gboolean +remote_msg(GIOChannel *channel, GIOCondition condition, gpointer data) +{ + gchar *uri = NULL; + g_io_channel_read_line(channel, &uri, NULL, NULL, NULL); + if (uri) { + g_strstrip(uri); + client_new(uri, NULL); + g_free(uri); + } + return TRUE; +} + void allocfail(void) { @@ -127,8 +113,7 @@ set_uri(const char *uri, struct Client *c) } WebKitWebView * -client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, - gboolean focus_tab) +client_new(const gchar *uri, WebKitWebView *related_wv) { struct Client *c; gchar *f; @@ -143,7 +128,6 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, } c = calloc(1, sizeof(struct Client)); if (!c) allocfail(); - c->focus_new_tab = focus_tab; if (related_wv == NULL) { WebKitUserContentManager *ucm = @@ -224,7 +208,7 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, "notify::estimated-load-progress", G_CALLBACK(changed_load_progress), c); g_signal_connect(G_OBJECT(c->web_view), "create", - G_CALLBACK(client_new_request), NULL); + G_CALLBACK(client_new_request), c); g_signal_connect(G_OBJECT(c->web_view), "close", G_CALLBACK(client_destroy), c); g_signal_connect(G_OBJECT(c->web_view), "decide-policy", @@ -345,11 +329,7 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show, gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(mw.notebook), c->vbox, TRUE); - if (show) - show_web_view(NULL, c); - else - g_signal_connect(G_OBJECT(c->web_view), "ready-to-show", - G_CALLBACK(show_web_view), c); + show_web_view(NULL, c); if (uri != NULL) { f = ensure_uri_scheme(uri); @@ -369,7 +349,10 @@ WebKitWebView * client_new_request(WebKitWebView *web_view, WebKitNavigationAction *navigation_action, gpointer data) { - return client_new(NULL, web_view, FALSE, FALSE); + switch_tab = FALSE; + WebKitWebView *new_web_view = client_new(NULL, web_view); + gtk_widget_grab_focus(GTK_WIDGET(new_web_view)); + return new_web_view; } void @@ -828,326 +811,11 @@ void reopen_tab(void) { if (num_closed == 0) return; - client_new(closed_tabs[num_closed - 1], NULL, TRUE, TRUE); + client_new(closed_tabs[num_closed - 1], NULL); num_closed--; closed_tabs = realloc(closed_tabs, num_closed * sizeof(closed_tabs[0])); if (!closed_tabs) allocfail(); } -gboolean -key_common(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - struct Client *c = (struct Client *)data; - gdouble now; - if (event->type == GDK_KEY_PRESS) { - guint mask = gtk_accelerator_get_default_mod_mask(); - int key = ((GdkEventKey *)event)->keyval; - if ((((GdkEventKey *)event)->state & mask) == - GDK_CONTROL_MASK) { - const char *uri = webkit_web_view_get_uri( - WEBKIT_WEB_VIEW(c->web_view)); - if (GDK_KEY_y == key) { - downloadmanager_show(); - return TRUE; - } else if (GDK_KEY_h == key) { - webkit_web_view_go_back( - WEBKIT_WEB_VIEW(c->web_view)); - return TRUE; - } else if (GDK_KEY_l == key) { - webkit_web_view_go_forward( - WEBKIT_WEB_VIEW(c->web_view)); - return TRUE; - } else if (GDK_KEY_s == key) { - gtk_widget_grab_focus(c->location); - return TRUE; - } else if (GDK_KEY_p == key) { - WebKitPrintOperation *operation = - webkit_print_operation_new( - WEBKIT_WEB_VIEW(c->web_view)); - GtkWidget *toplevel = - gtk_widget_get_toplevel(mw.win); - webkit_print_operation_run_dialog( - operation, GTK_WINDOW(toplevel)); - return TRUE; - } else if (GDK_KEY_g == key) { - isearch(c, 2); - gtk_widget_grab_focus(c->web_view); - if (uri) - gtk_entry_set_text( - GTK_ENTRY(c->location), uri); - webkit_web_view_run_javascript( - WEBKIT_WEB_VIEW(c->web_view), - "window.getSelection().removeAllRanges();" - "document.activeElement.blur();", - NULL, NULL, c); - gtk_widget_hide(c->isearch_box); - gtk_editable_set_position( - GTK_EDITABLE(c->location), -1); - gtk_editable_set_position( - GTK_EDITABLE(c->wsearch), -1); - return TRUE; - } else if (GDK_KEY_r == key) { - webkit_web_view_reload_bypass_cache( - WEBKIT_WEB_VIEW(c->web_view)); - return TRUE; - } else if (GDK_KEY_j == key) { - for (int i = 0; i <= cfg_scroll_lines - 1; - i++) { - event->key.keyval = GDK_KEY_Down; - gdk_event_put(event); - } - return TRUE; - } else if (GDK_KEY_k == key) { - for (int i = 0; i <= cfg_scroll_lines - 1; - i++) { - event->key.keyval = GDK_KEY_Up; - gdk_event_put(event); - } - return TRUE; - } else if (GDK_KEY_f == key) { - isearch_init(c, 1); - return TRUE; - } else if (GDK_KEY_q == key) { - client_destroy(NULL, c); - return TRUE; - } else if (GDK_KEY_1 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 0); - return TRUE; - } else if (GDK_KEY_2 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 1); - return TRUE; - } else if (GDK_KEY_3 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 2); - return TRUE; - } else if (GDK_KEY_4 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 3); - return TRUE; - } else if (GDK_KEY_5 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 4); - return TRUE; - } else if (GDK_KEY_6 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 5); - return TRUE; - } else if (GDK_KEY_7 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 6); - return TRUE; - } else if (GDK_KEY_8 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 7); - return TRUE; - } else if (GDK_KEY_9 == key) { - gtk_notebook_set_current_page( - GTK_NOTEBOOK(mw.notebook), 8); - return TRUE; - } else if (GDK_KEY_u == key) { - gtk_notebook_prev_page( - GTK_NOTEBOOK(mw.notebook)); - return TRUE; - } else if (GDK_KEY_m == key) { - gboolean muted = webkit_web_view_get_is_muted( - WEBKIT_WEB_VIEW(c->web_view)); - webkit_web_view_set_is_muted( - WEBKIT_WEB_VIEW(c->web_view), !muted); - changed_title(G_OBJECT(c->web_view), NULL, c); - return TRUE; - } else if (GDK_KEY_t == key) { - client_new(cfg_home_uri, NULL, TRUE, TRUE); - return TRUE; - } else if (GDK_KEY_bracketleft == key) { - reopen_tab(); - return TRUE; - } else if ((GDK_KEY_i == key) || (GDK_KEY_Tab == key)) { - gtk_notebook_next_page( - GTK_NOTEBOOK(mw.notebook)); - return TRUE; - } else if (GDK_KEY_d == key) { - gtk_widget_grab_focus(c->wsearch); - return TRUE; - } else if (GDK_KEY_equal == key) { - now = webkit_web_view_get_zoom_level( - WEBKIT_WEB_VIEW(c->web_view)); - webkit_web_view_set_zoom_level( - WEBKIT_WEB_VIEW(c->web_view), - now + 0.1); - return TRUE; - } else if (GDK_KEY_minus == key) { - now = webkit_web_view_get_zoom_level( - WEBKIT_WEB_VIEW(c->web_view)); - webkit_web_view_set_zoom_level( - WEBKIT_WEB_VIEW(c->web_view), - now - 0.1); - return TRUE; - } else if (GDK_KEY_0 == key) { - webkit_web_view_set_zoom_level( - WEBKIT_WEB_VIEW(c->web_view), 1); - return TRUE; - } - } else if ((((GdkEventKey *)event)->state & mask) == - (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) { - if (GDK_KEY_ISO_Left_Tab == key) { - gtk_notebook_prev_page( - GTK_NOTEBOOK(mw.notebook)); - return TRUE; - } else if (GDK_KEY_T == key) { - reopen_tab(); - return TRUE; - } - } - } - return FALSE; -} - -gboolean -isearch_counted_matches(GtkWidget *widget, guint matches, gpointer data) -{ - struct Client *c = (struct Client *)data; - char *text = malloc(12); - sprintf(text, "%d matches", matches); - gtk_label_set_text(GTK_LABEL(c->isearch_matches), text); - free(text); - return TRUE; -} - -gboolean -key_isearch(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - struct Client *c = (struct Client *)data; - if (key_common(widget, event, data)) return TRUE; - - if (event->type == GDK_KEY_PRESS) { - int key = ((GdkEventKey *)event)->keyval; - if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) { - int direction = (((GdkEventKey *)event)->state & - GDK_SHIFT_MASK) ? - -1 : - 1; - isearch(c, 0); - isearch(c, -1); - isearch(c, direction); - return TRUE; - } else if (GDK_KEY_Escape == key) { - isearch(c, 2); - gtk_widget_hide(c->isearch_box); - gtk_widget_grab_focus(c->web_view); - } - } - return FALSE; -} - -gboolean -key_wsearch(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - struct Client *c = (struct Client *)data; - if (key_common(widget, event, data)) return TRUE; - - if (event->type == GDK_KEY_PRESS) { - int key = ((GdkEventKey *)event)->keyval; - if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) { - const gchar *t = - gtk_entry_get_text(GTK_ENTRY(c->wsearch)); - int len = strlen(cfg_search_engine) + strlen(t); - gchar *f = malloc(len + 1); - if (!f) allocfail(); - - snprintf(f, len + 1, "%s%s", cfg_search_engine, t); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), - f); - g_free(f); - gtk_widget_grab_focus(c->web_view); - return TRUE; - } - } - return FALSE; -} - -gboolean -key_location(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - struct Client *c = (struct Client *)data; - const gchar *t; - if (key_common(widget, event, data)) return TRUE; - - if (event->type == GDK_KEY_PRESS) { - int key = ((GdkEventKey *)event)->keyval; - if ((GDK_KEY_KP_Enter == key) || (GDK_KEY_Return == key)) { - gtk_widget_grab_focus(c->web_view); - t = gtk_entry_get_text(GTK_ENTRY(c->location)); - webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), - ensure_uri_scheme(t)); - return TRUE; - } else if (GDK_KEY_Escape == key) { - t = webkit_web_view_get_uri( - WEBKIT_WEB_VIEW(c->web_view)); - gtk_entry_set_text(GTK_ENTRY(c->location), - (t == NULL) ? "" : t); - return TRUE; - } - } - return FALSE; -} -gboolean -key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - GdkScrollDirection direction; - if (event->type == GDK_BUTTON_RELEASE) { - switch (((GdkEventButton *)event)->button) { - case 2: - client_destroy(NULL, data); - return TRUE; - } - } else if (event->type == GDK_SCROLL) { - gdk_event_get_scroll_direction(event, &direction); - switch (direction) { - case GDK_SCROLL_UP: - gtk_notebook_prev_page(GTK_NOTEBOOK(mw.notebook)); - break; - case GDK_SCROLL_DOWN: - gtk_notebook_next_page(GTK_NOTEBOOK(mw.notebook)); - break; - default: - break; - } - return TRUE; - } - return FALSE; -} - -gboolean -key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data) -{ - struct Client *c = (struct Client *)data; - gdouble dx, dy; - gfloat z; - if (key_common(c->web_view, event, data)) return TRUE; - - if (event->type == GDK_KEY_PRESS) { - if (((GdkEventKey *)event)->keyval == GDK_KEY_Escape) { - webkit_web_view_stop_loading( - WEBKIT_WEB_VIEW(c->web_view)); - gtk_entry_set_progress_fraction(GTK_ENTRY(c->location), - 0); - } - } else if (event->type == GDK_SCROLL) { - event->scroll.delta_y *= cfg_scroll_lines; - if (((GdkEventScroll *)event)->state & GDK_CONTROL_MASK) { - gdk_event_get_scroll_deltas(event, &dx, &dy); - z = webkit_web_view_get_zoom_level( - WEBKIT_WEB_VIEW(c->web_view)); - z += -dy * 0.1; - z = dx != 0 ? 1 : z; - webkit_web_view_set_zoom_level( - WEBKIT_WEB_VIEW(c->web_view), z); - return TRUE; - } - } - return FALSE; -} void mainwindow_setup(void) @@ -1205,32 +873,6 @@ notebook_switch_page(GtkNotebook *nb, GtkWidget *p, guint idx, gpointer data) mainwindow_title(idx); } -gboolean -quit_if_nothing_active(void) -{ - if (clients == 0) { - if (downloads == 0) { - gtk_main_quit(); - return TRUE; - } else { - downloadmanager_show(); - } - } - return FALSE; -} -gboolean -remote_msg(GIOChannel *channel, GIOCondition condition, gpointer data) -{ - gchar *uri = NULL; - g_io_channel_read_line(channel, &uri, NULL, NULL, NULL); - if (uri) { - g_strstrip(uri); - client_new(uri, NULL, TRUE, TRUE); - g_free(uri); - } - return TRUE; -} - void show_web_view(WebKitWebView *web_view, gpointer data) { @@ -1242,13 +884,9 @@ show_web_view(WebKitWebView *web_view, gpointer data) gtk_notebook_get_nth_page(GTK_NOTEBOOK(mw.notebook), idx))); gtk_widget_hide(c->isearch_box); - if (c->focus_new_tab) { - if (idx != -1) - gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), - idx); - - gtk_widget_grab_focus(c->web_view); - } + if (idx != -1 && switch_tab) + gtk_notebook_set_current_page(GTK_NOTEBOOK(mw.notebook), idx); + gtk_widget_grab_focus(c->web_view); } void @@ -1338,10 +976,9 @@ main(int argc, char **argv) mainwindow_setup(); if (optind >= argc) { - client_new(cfg_home_uri, NULL, TRUE, TRUE); + client_new(cfg_home_uri, NULL); } else { - for (i = optind; i < argc; i++) - client_new(argv[i], NULL, TRUE, TRUE); + for (i = optind; i < argc; i++) client_new(argv[i], NULL); } if (cfg.noncooperative_instances || cfg.cooperative_alone) {