From 40475f9520d4065bb119224e90a4e381143f61d6 Mon Sep 17 00:00:00 2001 From: fenze Date: Fri, 13 May 2022 00:45:02 +0200 Subject: [PATCH] add scroll keybinds, remove ghost webkit process --- config.h | 5 +- keyconf.h | 4 +- makefile | 4 +- rose.c | 53 +-------------------- window.c | 139 +++++++++++++++++++++++++++++++----------------------- 5 files changed, 91 insertions(+), 114 deletions(-) diff --git a/config.h b/config.h index 4b97763..b8f5e23 100644 --- a/config.h +++ b/config.h @@ -15,5 +15,8 @@ static Key keys[] = { { MODKEY, GDK_KEY_e, search }, { MODKEY, GDK_KEY_equal, zoomin }, { MODKEY, GDK_KEY_minus, zoomout }, - { 0, GDK_KEY_F11, fullscreen }, + { MODKEY, GDK_KEY_i, inspector }, + { MODKEY, GDK_KEY_j, down }, + { MODKEY, GDK_KEY_k, up }, + { 0, GDK_KEY_F11, fullscreen } }; diff --git a/keyconf.h b/keyconf.h index f33e1f7..a0c6e61 100644 --- a/keyconf.h +++ b/keyconf.h @@ -20,5 +20,7 @@ enum { inspector, search, zoomin, - zoomout + zoomout, + down, + up }; diff --git a/makefile b/makefile index f0a417b..9d1f1fe 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ CC = clang CFLAGS = `pkg-config --cflags gtk4 webkit2gtk-5.0 x11 ` LIBS = `pkg-config --libs gtk4 webkit2gtk-5.0 x11` -GTKFLAGS = -Dgtk_doc=false -Dintrospection=false \ +OPTIONS = -Dgtk_doc=false -Dintrospection=false \ -DG_DISABLE_CAST_CHECKS \ -Dcloudproviders=false \ -DGTK_DISABLE_DEPRECATED \ @@ -18,7 +18,7 @@ GTKFLAGS = -Dgtk_doc=false -Dintrospection=false \ all: - ${CC} -fPIC -Os -o rose *.c $(CFLAGS) $(LIBS) $(GTKFLAGS) + ${CC} -fPIC -O3 -o rose *.c $(CFLAGS) $(LIBS) $(OPTIONS) strip ./rose install: all diff --git a/rose.c b/rose.c index ec6ab74..f73bcce 100644 --- a/rose.c +++ b/rose.c @@ -5,17 +5,6 @@ guint xid; -void -sigchld(int unused) -{ - if (signal(SIGCHLD, sigchld) == SIG_ERR) { - puts("Can't install SIGCHLD handler"); - exit(1); - } - while (waitpid(-1, NULL, WNOHANG) > 0) - ; -} - void setatom(int a, const char *v) { @@ -25,31 +14,6 @@ setatom(int a, const char *v) XSync(dpy, False); } -static gboolean -readsock(GIOChannel *s, GIOCondition ioc, gpointer unused) -{ - static char msg[MSGBUFSZ]; - GError *gerr = NULL; - gsize msgsz; - - if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) != - G_IO_STATUS_NORMAL) { - if (gerr) { - fprintf(stderr, "surf: error reading socket: %s\n", - gerr->message); - g_error_free(gerr); - } - return TRUE; - } - - if (msgsz < 2) { - fprintf(stderr, "surf: message too short: %lu\n", msgsz); - return TRUE; - } - - return TRUE; -} - const char * getatom(int a) { @@ -74,10 +38,6 @@ getatom(int a) static void setup() { - GIOChannel *gchanin; - - sigchld(0); - if (!(dpy = XOpenDisplay(NULL))) { puts("Can't open default display"); exit(1); @@ -87,18 +47,6 @@ static void setup() atoms[AtomGo] = XInternAtom(dpy, "_ROSE_GO", False); atoms[AtomUri] = XInternAtom(dpy, "_ROSE_URI", False); atoms[AtomUTF8] = XInternAtom(dpy, "UTF8_STRING", False); - - if (socketpair(AF_UNIX, SOCK_DGRAM, 0, spair) < 0) { - fputs("Unable to create sockets\n", stderr); - spair[0] = spair[1] = -1; - } else { - gchanin = g_io_channel_unix_new(spair[0]); - g_io_channel_set_encoding(gchanin, NULL, NULL); - g_io_channel_set_flags(gchanin, g_io_channel_get_flags(gchanin) - | G_IO_FLAG_NONBLOCK, NULL); - g_io_channel_set_close_on_unref(gchanin, TRUE); - g_io_add_watch(gchanin, G_IO_IN, readsock, NULL); - } } static void run(GtkApplication *app) @@ -124,4 +72,5 @@ int main(int argc, char **argv) GtkApplication *app = gtk_application_new("org.gtk.rose", G_APPLICATION_NON_UNIQUE); g_signal_connect(app, "activate", G_CALLBACK(run), NULL); g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); } diff --git a/window.c b/window.c index b18e8bd..c2f1552 100644 --- a/window.c +++ b/window.c @@ -1,10 +1,9 @@ #include "window.h" #include "rose.h" -/* #include "gestures.h" */ #include "config.h" #include "webview.h" -#define LENGTH(x) (sizeof(x) / sizeof(x[0])) +#define LENGTH(x) ((int) (sizeof(x) / sizeof(x[0]))) struct _RoseWindow { GtkApplicationWindow parent_instance; @@ -12,6 +11,7 @@ struct _RoseWindow { guint xid; GtkWindow *window; WebKitWebView *webview; + WebKitWebInspector *inspector; GHashTable *action_groups; GHashTable *action_labels; }; @@ -28,8 +28,7 @@ static void read_clipboard(GObject *object, GAsyncResult *res, gpointer webview) { - GdkDisplay *dpy = gdk_display_get_default(); - GdkClipboard *clipboard = gdk_display_get_clipboard(dpy); + GdkClipboard *clipboard = GDK_CLIPBOARD(object); webkit_web_view_load_uri( WEBKIT_WEB_VIEW(webview), gdk_clipboard_read_text_finish(clipboard, res, NULL) @@ -41,66 +40,80 @@ static gboolean key_press_callback(RoseWindow *window, guint keycode, GdkModifierType state) { + if (!state) + return GDK_EVENT_PROPAGATE; - for (int i = 0; i < LENGTH(keys); i++) { - if (keys[i].modkey == state - && keys[i].keycod == keyval) { - switch (keys[i].funcid) { - case goback: - webkit_web_view_go_back(window->webview); - break; - case goforward: - webkit_web_view_go_forward(window->webview); - break; - case copy_url: { - GdkDisplay *dpy = gdk_display_get_default(); - gdk_clipboard_set_text( - gdk_display_get_clipboard(dpy), - webkit_web_view_get_uri(window->webview) - ); - } break; - case paste_url: { - GdkDisplay *dpy = gdk_display_get_default(); - GdkClipboard *clipboard = gdk_display_get_clipboard(dpy); - gdk_clipboard_read_text_async(clipboard, NULL, read_clipboard, window->webview); - } break; - case fullscreen: - if (gtk_window_is_fullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview))))) - gtk_window_unfullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview)))); - else - gtk_window_fullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview)))); - break; - case search: { - int id = fork(); - if (id == 0) { - if (dpy) - close(ConnectionNumber(dpy)); - close(spair[0]); - close(spair[1]); - setsid(); - char* argument_list[] = { "/bin/sh", "-c", "surf-open", NULL}; - execvp("/bin/sh", argument_list); - perror(" failed"); - exit(1); - } else { - wait(&id); - webkit_web_view_load_uri(window->webview, getatom(AtomGo)); - } + for (int i = 0; i < LENGTH(keys); i++) { + if (keys[i].modkey == state + && keys[i].keycod == keyval) { + switch (keys[i].funcid) { + case goback: + webkit_web_view_go_back(window->webview); + break; + case goforward: + webkit_web_view_go_forward(window->webview); + break; + case copy_url: { + GdkDisplay *dpy = gdk_display_get_default(); + gdk_clipboard_set_text( + gdk_display_get_clipboard(dpy), + webkit_web_view_get_uri(window->webview) + ); + } break; + case paste_url: { + GdkDisplay *dpy = gdk_display_get_default(); + GdkClipboard *clipboard = gdk_display_get_clipboard(dpy); + gdk_clipboard_read_text_async(clipboard, NULL, read_clipboard, window->webview); + } break; + case fullscreen: + if (gtk_window_is_fullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview))))) + gtk_window_unfullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview)))); + else + gtk_window_fullscreen(GTK_WINDOW(gtk_widget_get_root(GTK_WIDGET(window->webview)))); + break; + case search: { + int id = fork(); + if (id == 0) { + if (dpy) + close(ConnectionNumber(dpy)); + close(spair[0]); + close(spair[1]); + setsid(); + char* argument_list[] = { "/bin/sh", "-c", "surf-open", NULL}; + execvp("/bin/sh", argument_list); + perror(" failed"); + exit(1); + } else { + wait(&id); + webkit_web_view_load_uri(window->webview, getatom(AtomGo)); } - case zoomin: - zoom += 0.1; - webkit_web_view_set_zoom_level(window->webview, zoom); - break; - case zoomout: - zoom -= 0.1; - webkit_web_view_set_zoom_level(window->webview, zoom); - break; } + case zoomin: + zoom += 0.1; + webkit_web_view_set_zoom_level(window->webview, zoom); + break; + case zoomout: + zoom -= 0.1; + webkit_web_view_set_zoom_level(window->webview, zoom); + break; + case inspector: + window->inspector = webkit_web_view_get_inspector(window->webview); + if (webkit_web_inspector_is_attached(window->inspector)) + webkit_web_inspector_close(window->inspector); + else + webkit_web_inspector_show(window->inspector); + return GDK_EVENT_STOP; + break; + case up: + webkit_web_view_run_javascript(window->webview, "window.scrollBy(0,-100);", NULL, NULL, NULL); + break; + case down: + webkit_web_view_run_javascript(window->webview, "window.scrollBy(0,100);", NULL, NULL, NULL); + break; } } + } - printf("%i\n", keyval); - puts(""); return GDK_EVENT_PROPAGATE; } @@ -114,6 +127,11 @@ static void rose_window_init(RoseWindow *window) window->window = GTK_WINDOW(gtk_window_new()); } +static void destroy(RoseWindow *window) +{ + exit(0); +} + guint rose_window_show(GtkApplication *app, RoseWindow *window, const char *url) { GtkWidget *w = gtk_application_window_new(app); @@ -125,6 +143,11 @@ guint rose_window_show(GtkApplication *app, RoseWindow *window, const char *url) gtk_window_set_destroy_with_parent(GTK_WINDOW(w), TRUE); window->webview = WEBKIT_WEB_VIEW(webview); + g_signal_connect(G_OBJECT(w), "destroy", + G_CALLBACK(destroy), window); + g_signal_connect(G_OBJECT(window->webview), "web-process-terminated", + G_CALLBACK(destroy), window); + if (url) rose_webview_load_url(WEBKIT_WEB_VIEW(webview), url);