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.
20 * inverse color browsing
21 * tabs, alt-1..n to switch
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) & \
46 quit(struct karg
*args
)
62 int (*func
)(struct karg
*);
65 { GDK_CONTROL_MASK
, 0, GDK_q
, quit
, {0} }
69 activate_uri_entry_cb(GtkWidget
* entry
, gpointer data
)
71 gchar
*uri
= gtk_entry_get_text(GTK_ENTRY(entry
));
74 webkit_web_view_load_uri(wv
, uri
);
78 notify_load_status_cb(WebKitWebView
* wview
, GParamSpec
* pspec
, gpointer data
)
80 WebKitWebFrame
*frame
;
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
);
87 gtk_entry_set_text(GTK_ENTRY(uri_entry
), uri
);
92 webview_keypress_cb(WebKitWebView
*webview
, GdkEventKey
*e
)
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
);
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
);
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");
134 GtkWidget
*toolbar
= gtk_toolbar_new();
137 #if GTK_CHECK_VERSION(2,15,0)
138 gtk_orientable_set_orientation(GTK_ORIENTABLE(toolbar
),
139 GTK_ORIENTATION_HORIZONTAL
);
141 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar
),
142 GTK_ORIENTATION_HORIZONTAL
);
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);
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
,
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
[])
183 gtk_init(&argc
, &argv
);
184 if (!g_thread_supported())
188 //gtk_widget_hide(tb);