Add keys
[xxxterm.git] / xxxterm.c
blob5042803ce07b86413e2a4e28612994681d1838b2
1 /* $xxxterm$ */
2 /*
3 * Copyright (c) 2010 Marco Peereboom <marco@peereboom.us>
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 * TODO:
20 * inverse color browsing
21 * tabs, alt-1..n to switch
22 * favs
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <gtk/gtk.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <webkit/webkit.h>
30 #include <libsoup/soup.h>
32 #define LENGTH(x) (sizeof x / sizeof x[0])
33 #define CLEAN(mask) (mask & ~(GDK_MOD2_MASK) & \
34 ~(GDK_BUTTON1_MASK) & \
35 ~(GDK_BUTTON2_MASK) & \
36 ~(GDK_BUTTON3_MASK) & \
37 ~(GDK_BUTTON4_MASK) & \
38 ~(GDK_BUTTON5_MASK))
40 GtkWidget *mw;
41 GtkWidget *uri_entry;
42 GtkWidget *tb;
43 WebKitWebView *wv;
45 int
46 quit(struct karg *args)
48 gtk_main_quit();
50 return (0);
53 struct karg {
54 int i;
55 char *s;
58 struct key {
59 guint mask;
60 guint modkey;
61 guint key;
62 int (*func)(struct karg *);
63 struct karg arg;
64 } keys[] = {
65 { GDK_CONTROL_MASK, 0, GDK_q, quit, {0} }
68 void
69 activate_uri_entry_cb(GtkWidget* entry, gpointer data)
71 gchar *uri = gtk_entry_get_text(GTK_ENTRY(entry));
73 g_assert(uri);
74 webkit_web_view_load_uri(wv, uri);
77 void
78 notify_load_status_cb(WebKitWebView* wview, GParamSpec* pspec, gpointer data)
80 WebKitWebFrame *frame;
81 gchar *uri;
83 if (webkit_web_view_get_load_status(wview) == WEBKIT_LOAD_COMMITTED) {
84 frame = webkit_web_view_get_main_frame(wview);
85 uri = webkit_web_frame_get_uri(frame);
86 if (uri)
87 gtk_entry_set_text(GTK_ENTRY(uri_entry), uri);
91 void
92 webview_keypress_cb(WebKitWebView *webview, GdkEventKey *e)
94 int i;
96 for (i = 0; i < LENGTH(keys); i++)
97 if (e->keyval == keys[i].key && CLEAN(e->state) == keys[i].mask)
98 keys[i].func(&keys[i].arg);
101 GtkWidget *
102 create_browser(void)
104 GtkWidget *w;
106 w = gtk_scrolled_window_new(NULL, NULL);
107 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(w),
108 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
110 wv = WEBKIT_WEB_VIEW(webkit_web_view_new());
111 gtk_container_add(GTK_CONTAINER(w), GTK_WIDGET(wv));
113 g_signal_connect(wv, "notify::load-status",
114 G_CALLBACK(notify_load_status_cb), wv);
116 return (w);
119 GtkWidget *
120 create_window(void)
122 GtkWidget *w;
124 w = gtk_window_new(GTK_WINDOW_TOPLEVEL);
125 gtk_window_set_default_size(GTK_WINDOW(w), 800, 600);
126 gtk_widget_set_name(w, "xxxterm");
128 return (w);
131 GtkWidget *
132 create_toolbar(void)
134 GtkWidget *toolbar = gtk_toolbar_new();
135 GtkToolItem *i;
137 #if GTK_CHECK_VERSION(2,15,0)
138 gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar),
139 GTK_ORIENTATION_HORIZONTAL);
140 #else
141 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
142 GTK_ORIENTATION_HORIZONTAL);
143 #endif
144 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH_HORIZ);
146 i = gtk_tool_item_new();
147 gtk_tool_item_set_expand(i, TRUE);
148 uri_entry = gtk_entry_new();
149 gtk_container_add(GTK_CONTAINER(i), uri_entry);
150 g_signal_connect(G_OBJECT(uri_entry), "activate",
151 G_CALLBACK(activate_uri_entry_cb), NULL);
152 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), i, -1);
153 tb = toolbar;
154 return (toolbar);
157 void
158 gui(void)
160 GtkWidget *vbox;
162 vbox = gtk_vbox_new(FALSE, 0);
163 gtk_box_pack_end(GTK_BOX(vbox), create_toolbar(), FALSE, FALSE, 0);
164 gtk_box_pack_start(GTK_BOX(vbox), create_browser(), TRUE, TRUE, 0);
166 mw = create_window();
167 gtk_container_add(GTK_CONTAINER(mw), vbox);
169 g_object_connect((GObject*)wv,
170 "signal::key-press-event", (GCallback)webview_keypress_cb, NULL,
171 NULL);
173 webkit_web_view_load_uri(wv, "http://www.peereboom.us/");
175 gtk_widget_grab_focus(GTK_WIDGET(wv));
176 gtk_widget_show_all(mw);
180 main(int argc, char *argv[])
182 /* prepare gtk */
183 gtk_init(&argc, &argv);
184 if (!g_thread_supported())
185 g_thread_init(NULL);
187 gui();
188 //gtk_widget_hide(tb);
190 gtk_main();
192 return (0);