]> git.armaanb.net Git - chorizo.git/blob - sn.c
README: Remove paragraph about WebKit2
[chorizo.git] / sn.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <gtk/gtk.h>
5 #include <webkit/webkit.h>
6
7 static void sn_destroy_client(GtkWidget *, gpointer);
8 static void sn_new_client(const gchar *uri);
9 static gboolean sn_new_window_request(WebKitWebView *, WebKitWebFrame *,
10                       WebKitNetworkRequest *, WebKitWebNavigationAction *,
11                       WebKitWebPolicyDecision *, gpointer);
12 static void sn_title_changed(GObject *, GParamSpec *, gpointer);
13
14
15 int clients = 0;
16 double global_zoom = 1.0;
17
18
19 struct Client
20 {
21         GtkWidget *win;
22         GtkWidget *scroll;
23         GtkWidget *web_view;
24 };
25
26
27 void
28 sn_destroy_client(GtkWidget *obj, gpointer data)
29 {
30         struct Client *c = (struct Client *)data;
31
32         (void)obj;
33
34         webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(c->web_view));
35         gtk_widget_destroy(c->web_view);
36         gtk_widget_destroy(c->scroll);
37         gtk_widget_destroy(c->win);
38         free(c);
39
40         clients--;
41         if (clients == 0)
42                 gtk_main_quit();
43 }
44
45 void
46 sn_new_client(const gchar *uri)
47 {
48         struct Client *c = malloc(sizeof(struct Client));
49         if (!c)
50         {
51                 fprintf(stderr, "sn: fatal: malloc failed\n");
52                 exit(EXIT_FAILURE);
53         }
54
55         c->win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
56         g_signal_connect(G_OBJECT(c->win), "destroy", G_CALLBACK(sn_destroy_client),
57                          c);
58         gtk_window_set_has_resize_grip(GTK_WINDOW(c->win), FALSE);
59         gtk_window_set_title(GTK_WINDOW(c->win), "sn");
60
61         c->web_view = webkit_web_view_new();
62         webkit_web_view_set_full_content_zoom(WEBKIT_WEB_VIEW(c->web_view), TRUE);
63         webkit_web_view_set_zoom_level(WEBKIT_WEB_VIEW(c->web_view), global_zoom);
64         g_signal_connect(G_OBJECT(c->web_view), "notify::title",
65                          G_CALLBACK(sn_title_changed), c->win);
66         g_signal_connect(G_OBJECT(c->web_view),
67                          "new-window-policy-decision-requested",
68                          G_CALLBACK(sn_new_window_request), NULL);
69
70         c->scroll = gtk_scrolled_window_new(NULL, NULL);
71
72         gtk_container_add(GTK_CONTAINER(c->scroll), c->web_view);
73         gtk_container_add(GTK_CONTAINER(c->win), c->scroll);
74
75         gtk_widget_show_all(c->win);
76
77         webkit_web_view_load_uri(WEBKIT_WEB_VIEW(c->web_view), uri);
78
79         clients++;
80 }
81
82 gboolean
83 sn_new_window_request(WebKitWebView *web_view, WebKitWebFrame *frame,
84                       WebKitNetworkRequest *request,
85                       WebKitWebNavigationAction *navigation_action,
86                       WebKitWebPolicyDecision *policy_decision,
87                       gpointer user_data)
88 {
89         (void)web_view;
90         (void)frame;
91         (void)navigation_action;
92         (void)user_data;
93
94         webkit_web_policy_decision_ignore(policy_decision);
95         sn_new_client(webkit_network_request_get_uri(request));
96
97         return TRUE;
98 }
99
100 void
101 sn_title_changed(GObject *obj, GParamSpec *pspec, gpointer data)
102 {
103         const gchar *t;
104         WebKitWebView *view = WEBKIT_WEB_VIEW(obj);
105         GtkWindow *win = GTK_WINDOW(data);
106
107         (void)pspec;
108
109         t = webkit_web_view_get_title(view);
110         gtk_window_set_title(win, (t == NULL ? "sn" : t));
111 }
112
113 int
114 main(int argc, char **argv)
115 {
116         int opt;
117
118         gtk_init(&argc, &argv);
119
120         while ((opt = getopt(argc, argv, "z:")) != -1)
121         {
122                 switch (opt)
123                 {
124                         case 'z':
125                                 global_zoom = atof(optarg);
126                                 break;
127                 }
128         }
129
130         if (optind >= argc)
131         {
132                 fprintf(stderr, "Usage: sn [OPTIONS] <URI>\n");
133                 exit(EXIT_FAILURE);
134         }
135
136         sn_new_client(argv[optind]);
137         gtk_main();
138         exit(EXIT_SUCCESS);
139 }