]> git.armaanb.net Git - chorizo.git/blobdiff - browser.c
draft 4
[chorizo.git] / browser.c
index b35d383ae76e3c8164dea37ee8f9cd94bcffb4fd..385f1671d2741eeb24f5e4ded80d5662aa85b4fe 100644 (file)
--- a/browser.c
+++ b/browser.c
@@ -31,8 +31,10 @@ void show_web_view(WebKitWebView *, gpointer);
 void trust_user_certs(WebKitWebContext *);
 
 struct Client {
-       GtkWidget *jsbutton;
        GtkWidget *location;
+       GtkWidget *search;
+       GtkWidget *search_switch;
+       GtkWidget *isearch;
        GtkWidget *tabicon;
        GtkWidget *tablabel;
        GtkWidget *vbox;
@@ -72,16 +74,6 @@ allocfail(void)
        exit(EXIT_FAILURE);
 }
 
-void
-togglejs(GtkButton *jsbutton, gpointer data)
-{
-       struct Client *c = (struct Client *)data;
-       webkit_settings_set_enable_javascript(
-               c->settings,
-               !webkit_settings_get_enable_javascript(c->settings));
-       webkit_web_view_set_settings(WEBKIT_WEB_VIEW(c->web_view), c->settings);
-}
-
 void
 client_destroy(GtkWidget *widget, gpointer data)
 {
@@ -212,7 +204,6 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
 
        c->settings =
                webkit_web_view_get_settings(WEBKIT_WEB_VIEW(c->web_view));
-       webkit_settings_set_enable_javascript(c->settings, cfg_js_default);
        if (cfg.verbose)
                webkit_settings_set_enable_write_console_messages_to_stdout(
                        c->settings, true);
@@ -235,8 +226,6 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
                         G_CALLBACK(decide_policy), NULL);
        g_signal_connect(G_OBJECT(c->web_view), "key-press-event",
                         G_CALLBACK(key_web_view), c);
-       g_signal_connect(G_OBJECT(c->web_view), "button-release-event",
-                        G_CALLBACK(key_web_view), c);
        g_signal_connect(G_OBJECT(c->web_view), "scroll-event",
                         G_CALLBACK(key_web_view), c);
        g_signal_connect(G_OBJECT(c->web_view), "mouse-target-changed",
@@ -245,16 +234,15 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
                         G_CALLBACK(crashed_web_view), c);
 
        GtkWidget *locbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
-       c->jsbutton = gtk_toggle_button_new_with_label("JS");
-       gtk_widget_set_tooltip_text(c->jsbutton, "Toggle JavaScript execution");
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(c->jsbutton),
-                                    cfg_js_default);
-       g_signal_connect(G_OBJECT(c->jsbutton), "toggled", G_CALLBACK(togglejs),
-                        c);
 
        c->location = gtk_entry_new();
+       gtk_entry_set_placeholder_text(GTK_ENTRY(c->location), "Web address");
        gtk_box_pack_start(GTK_BOX(locbox), c->location, TRUE, TRUE, 0);
 
+       c->search = gtk_entry_new();
+       gtk_entry_set_placeholder_text(GTK_ENTRY(c->search), "Search");
+       gtk_box_pack_start(GTK_BOX(locbox), c->search, FALSE, TRUE, 0);
+
        if (cfg.private) {
                GtkWidget *privindicator = gtk_label_new("Private mode");
                gtk_widget_set_tooltip_text(
@@ -264,7 +252,6 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
                gtk_box_pack_end(GTK_BOX(locbox), privindicator, FALSE, FALSE,
                                 5);
        }
-       gtk_box_pack_start(GTK_BOX(locbox), c->jsbutton, FALSE, FALSE, 5);
 
        g_signal_connect(G_OBJECT(c->location), "key-press-event",
                         G_CALLBACK(key_location), c);
@@ -284,6 +271,15 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
        c->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
        gtk_box_pack_start(GTK_BOX(c->vbox), locbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(c->vbox), c->web_view, TRUE, TRUE, 0);
+
+       GtkWidget *overlay = gtk_overlay_new();
+       c->isearch = gtk_entry_new();
+       gtk_container_add(GTK_CONTAINER(c->vbox), overlay);
+       gtk_container_add(GTK_CONTAINER(overlay), c->isearch);
+      gtk_widget_set_halign (overlay, GTK_ALIGN_CENTER);
+           gtk_widget_set_valign (overlay, GTK_ALIGN_CENTER);
+       gtk_widget_show_all(overlay);
+
        gtk_container_set_focus_child(GTK_CONTAINER(c->vbox), c->web_view);
 
        c->tabicon = gtk_image_new_from_icon_name("text-html",
@@ -291,7 +287,7 @@ client_new(const gchar *uri, WebKitWebView *related_wv, gboolean show,
 
        c->tablabel = gtk_label_new("chorizo");
        gtk_label_set_ellipsize(GTK_LABEL(c->tablabel), PANGO_ELLIPSIZE_END);
-       gtk_label_set_width_chars(GTK_LABEL(c->tablabel), 20);
+       gtk_label_set_width_chars(GTK_LABEL(c->tablabel), cfg_tab_width);
        gtk_widget_set_has_tooltip(c->tablabel, TRUE);
 
        /*
@@ -525,12 +521,6 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data)
        FILE *fp;
        t = webkit_web_view_get_uri(WEBKIT_WEB_VIEW(c->web_view));
 
-       /*
-       * When a web process crashes, we get a "notify::uri" signal, but we
-       * can no longer read a meaningful URI. It's just an empty string
-       * now. Not updating the location bar in this scenario is important,
-       * because we would override the "WEB PROCESS CRASHED" message.
-       */
        if (t != NULL && strlen(t) > 0) {
                set_uri(t, c);
 
@@ -558,15 +548,19 @@ changed_uri(GObject *obj, GParamSpec *pspec, gpointer data)
                g_free(state_dir);
        }
 }
+
 gboolean
 crashed_web_view(WebKitWebView *web_view, gpointer data)
 {
-       gchar *t;
        struct Client *c = (struct Client *)data;
-       t = g_strdup_printf("WEB PROCESS CRASHED: %s",
-                           webkit_web_view_get_uri(WEBKIT_WEB_VIEW(web_view)));
-       gtk_entry_set_text(GTK_ENTRY(c->location), t);
-       g_free(t);
+       GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT;
+       GtkWidget *dialog = gtk_message_dialog_new(
+               GTK_WINDOW(c->vbox), flags, GTK_MESSAGE_ERROR,
+               GTK_BUTTONS_CLOSE, "ERROR: Web process %s crashed.",
+               webkit_web_view_get_uri(WEBKIT_WEB_VIEW(web_view)),
+               g_strerror(errno));
+       gtk_dialog_run(GTK_DIALOG(dialog));
+       gtk_widget_destroy(dialog);
 
        return TRUE;
 }
@@ -818,6 +812,7 @@ search_init(struct Client *c, int direction)
                search(c, direction);
        }
 }
+
 gboolean
 key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
@@ -865,7 +860,7 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
                                        "document.activeElement.blur();",
                                        NULL, NULL, c);
                                return TRUE;
-                       } else if (GDK_KEY_r == key) {
+                       } else if (GDK_KEY_semicolon == key) {
                                webkit_web_view_reload_bypass_cache(
                                        WEBKIT_WEB_VIEW(c->web_view));
                                return TRUE;
@@ -964,17 +959,6 @@ key_common(GtkWidget *widget, GdkEvent *event, gpointer data)
                                gtk_notebook_next_page(
                                        GTK_NOTEBOOK(mw.notebook));
                                return TRUE;
-                       } else if (GDK_KEY_p == key) {
-                               gboolean on =
-                                       webkit_settings_get_enable_javascript(
-                                               c->settings);
-                               webkit_settings_set_enable_javascript(
-                                       c->settings, !on);
-                               webkit_web_view_set_settings(
-                                       WEBKIT_WEB_VIEW(c->web_view),
-                                       c->settings);
-                               gtk_toggle_button_set_active(
-                                       GTK_TOGGLE_BUTTON(c->jsbutton), !on);
                        } else if (GDK_KEY_d == key) {
                                gtk_widget_grab_focus(c->location);
                                gtk_entry_set_text(GTK_ENTRY(c->location),
@@ -1073,6 +1057,7 @@ key_tablabel(GtkWidget *widget, GdkEvent *event, gpointer data)
        }
        return FALSE;
 }
+
 gboolean
 key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
 {
@@ -1088,26 +1073,6 @@ key_web_view(GtkWidget *widget, GdkEvent *event, gpointer data)
                        gtk_entry_set_progress_fraction(GTK_ENTRY(c->location),
                                                        0);
                }
-       } else if (event->type == GDK_BUTTON_RELEASE) {
-               GdkModifierType modifiers =
-                       gtk_accelerator_get_default_mod_mask();
-               switch (((GdkEventButton *)event)->button) {
-               case 1:
-                       if ((((GdkEventButton *)event)->state & modifiers) ==
-                                   GDK_CONTROL_MASK &&
-                           c->hover_uri != NULL) {
-                               client_new(c->hover_uri, NULL, TRUE, FALSE);
-                               return TRUE;
-                       }
-                       break;
-               case 8:
-                       webkit_web_view_go_back(WEBKIT_WEB_VIEW(c->web_view));
-                       return TRUE;
-               case 9:
-                       webkit_web_view_go_forward(
-                               WEBKIT_WEB_VIEW(c->web_view));
-                       return TRUE;
-               }
        } else if (event->type == GDK_SCROLL) {
                event->scroll.delta_y *= cfg_scroll_lines;
                if (((GdkEventScroll *)event)->state & GDK_CONTROL_MASK) {
@@ -1140,9 +1105,21 @@ mainwindow_setup(void)
 
        mw.notebook = gtk_notebook_new();
        gtk_notebook_set_scrollable(GTK_NOTEBOOK(mw.notebook), TRUE);
+       gtk_notebook_set_tab_pos(GTK_NOTEBOOK(mw.notebook), GTK_POS_LEFT);
        gtk_container_add(GTK_CONTAINER(mw.win), mw.notebook);
        g_signal_connect(G_OBJECT(mw.notebook), "switch-page",
                         G_CALLBACK(notebook_switch_page), NULL);
+
+       GtkCssProvider *css = gtk_css_provider_new();
+       const char *css_data = "notebook header.left * { \
+                                       margin: 0; \
+                                       padding-top: 0; \
+                                       padding-bottom: 0; \
+                               }";
+       gtk_css_provider_load_from_data(css, css_data, strlen(css_data), NULL);
+       gtk_style_context_add_provider_for_screen(
+               gdk_screen_get_default(), GTK_STYLE_PROVIDER(css),
+               GTK_STYLE_PROVIDER_PRIORITY_USER);
 }
 
 void
@@ -1165,6 +1142,7 @@ notebook_switch_page(GtkNotebook *nb, GtkWidget *p, guint idx, gpointer data)
 {
        mainwindow_title(idx);
 }
+
 gboolean
 quit_if_nothing_active(void)
 {
@@ -1284,7 +1262,7 @@ main(int argc, char **argv)
 
        gtk_init(&argc, &argv);
 
-       //Keep clipboard contents after program closes
+       // Keep clipboard contents after program closes
        gtk_clipboard_store(gtk_clipboard_get_for_display(
                gdk_display_get_default(), GDK_SELECTION_CLIPBOARD));
 
@@ -1310,7 +1288,6 @@ main(int argc, char **argv)
                gtk_main();
                remove(fifopath);
        }
-       for (int i = 0; i < clients; i++) { free(&(client_arr[i])); }
 
        exit(EXIT_SUCCESS);
 }