2
Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
4
This library is free software; you can redistribute it and/or
5
modify it under the terms of the GNU Lesser General Public
6
License as published by the Free Software Foundation; either
7
version 2.1 of the License, or (at your option) any later version.
9
See the file COPYING for the full license text.
20
WebKitNavigationResponse on_webView_navigation_requested(GtkWidget* webView
21
, WebKitWebFrame* frame, WebKitNetworkRequest* networkRequest)
23
WebKitNavigationResponse response = WEBKIT_NAVIGATION_RESPONSE_ACCEPT;
24
// TODO: Ask webkit wether it knows the protocol for "unknown protcol"
25
// TODO: This isn't the place for uri scheme handling
26
const gchar* uri = webkit_network_request_get_uri(networkRequest);
27
gchar* protocol = strtok(g_strdup(uri), ":");
28
if(spawn_protocol_command(protocol, uri))
29
response = WEBKIT_NAVIGATION_RESPONSE_IGNORE;
34
void on_webView_location_changed(GtkWidget* webView, const gchar* uri
37
gchar* newUri = g_strdup(uri ? uri : "");
38
xbel_bookmark_set_href(browser->sessionItem, newUri);
39
if(webView == get_nth_webView(-1, browser))
41
gtk_entry_set_text(GTK_ENTRY(browser->location), newUri);
42
gtk_label_set_text(GTK_LABEL(browser->webView_name), newUri);
43
update_status_message(NULL, browser);
44
update_gui_state(browser);
48
void on_webView_title_changed(GtkWidget* webView, const gchar* title
49
, const gchar* uri, CBrowser* browser)
51
// TODO: We emulate location_changed here for now
52
// Shouldn't we have separated title_changed and location_changed signals?
53
on_webView_location_changed(webView, uri, browser);
55
newTitle = g_strdup(title ? title : uri);
56
xbel_item_set_title(browser->sessionItem, newTitle);
57
gtk_label_set_text(GTK_LABEL(browser->webView_name), newTitle);
58
sokoke_widget_set_tooltip_text(gtk_widget_get_parent(
59
gtk_widget_get_parent(browser->webView_name)), newTitle);
60
gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
61
browser->webView_menu))), newTitle);
62
if(webView == get_nth_webView(-1, browser))
64
gchar* windowTitle = g_strconcat(newTitle, " - ", PACKAGE_NAME, NULL);
65
gtk_window_set_title(GTK_WINDOW(browser->window), windowTitle);
70
void on_webView_icon_changed(GtkWidget* webView, WebKitWebFrame* widget
73
// TODO: Implement icon updates; currently this isn't ever called anyway
74
const gchar* icon = NULL;
78
gtk_label_set_text(GTK_LABEL(browser->webView_name), "icon");
79
gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
80
browser->webView_menu))), "icon");
81
if(webView == get_nth_webView(-1, browser))
83
gchar* windowTitle = g_strconcat("icon", " - ", PACKAGE_NAME, NULL);
84
gtk_window_set_title(GTK_WINDOW(browser->window), windowTitle);
90
void on_webView_load_started(GtkWidget* webView, WebKitWebFrame* widget
93
browser->loadedPercent = 0;
94
browser->loadedBytes = 0;
95
browser->loadedBytesMax = 0;
96
update_favicon(browser);
97
if(webView == get_nth_webView(-1, browser))
98
update_gui_state(browser);
99
update_statusbar_text(browser);
100
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(browser->progress), 0.1);
101
gtk_widget_show(browser->progress);
104
void on_webView_load_changed(GtkWidget* webView, gint progress, CBrowser* browser)
106
browser->loadedBytes = progress;
107
browser->loadedBytes = 100;
108
if(webView == get_nth_webView(-1, browser))
109
update_gui_state(browser);
112
void on_webView_load_finished(GtkWidget* webView, WebKitWebFrame* widget
115
browser->loadedPercent = -1;
116
update_favicon(browser);
117
if(webView == get_nth_webView(-1, browser))
118
update_gui_state(browser);
119
update_statusbar_text(browser);
120
gtk_widget_hide(browser->progress);
123
void on_webView_status_message(GtkWidget* webView, const gchar* text, CBrowser* browser)
125
update_status_message(text, browser);
128
void on_webView_selection_changed(GtkWidget* webView, CBrowser* browser)
133
gboolean on_webView_console_message(GtkWidget* webView
134
, const gchar* message, gint line, const gchar* sourceId, CBrowser* browser)
139
void on_webView_link_hover(GtkWidget* webView, const gchar* tooltip
140
, const gchar* uri, CBrowser* browser)
142
update_status_message(uri, browser);
143
g_free(browser->elementUri);
144
browser->elementUri = g_strdup(uri);
148
GtkWidget* on_webView_window_open(GtkWidget* webView, const gchar* sUri
151
// A window is created
152
// TODO: Respect config->iNewPages
153
// TODO: Find out if this comes from a script or a click
154
// TODO: Block scripted popups, return NULL and show status icon
155
CBrowser* newBrowser = browser_new(config->openPopupsInTabs ? browser : NULL);
156
return newBrowser->webView;
160
void webView_popup(GtkWidget* webView, GdkEventButton* event, CBrowser* browser)
162
gboolean isLink = browser->elementUri != NULL; // Did we right-click a link?
163
gboolean haveLinks = FALSE; // TODO: Are several links selected?
164
gboolean isImage = FALSE; // TODO: Did we right-click an image?
165
gboolean isEditable = FALSE; //webkit_web_view_can_paste_clipboard(WEBKIT_WEB_VIEW(webView)); //...
166
gchar* selection = NULL; //webkit_web_view_get_selected_text(WEBKIT_WEB_VIEW(webView));
168
update_edit_items(browser);
170
// Download manager available?
171
const gchar* downloadManager = g_datalist_get_data(&config->protocols_commands, "download");
172
gboolean canDownload = downloadManager && *downloadManager;
174
action_set_visible("LinkTabNew", isLink, browser);
175
action_set_visible("LinkTabCurrent", isLink, browser);
176
action_set_visible("LinkWindowNew", isLink, browser);
178
action_set_visible("LinkSaveAs", isLink, browser);
179
action_set_visible("LinkSaveWith", isLink && canDownload, browser);
180
action_set_visible("LinkCopy", isLink, browser);
181
action_set_visible("LinkBookmarkNew", isLink, browser);
183
action_set_visible("SelectionLinksNewTabs", haveLinks && selection && *selection, browser);
184
action_set_visible("SelectionTextTabNew", haveLinks && selection && *selection, browser);
185
action_set_visible("SelectionTextTabCurrent", haveLinks && selection && *selection, browser);
186
action_set_visible("SelectionTextWindowNew", haveLinks && selection && *selection, browser);
188
action_set_visible("ImageViewTabNew", isImage, browser);
189
action_set_visible("ImageViewTabCurrent", isImage, browser);
190
action_set_visible("ImageSaveAs", isImage, browser);
191
action_set_visible("ImageSaveWith", isImage && canDownload, browser);
192
action_set_visible("ImageCopy", isImage, browser);
194
action_set_visible("Copy_", (selection && *selection) || isEditable, browser);
195
action_set_visible("SelectionSearch", selection && *selection, browser);
196
action_set_visible("SelectionSearchWith", selection && *selection, browser);
197
action_set_visible("SelectionSourceView", selection && *selection, browser);
199
action_set_visible("SourceView", !selection, browser);
202
sokoke_widget_popup(webView, GTK_MENU(browser->popup_editable), event);
203
else if(isLink || isImage || (selection && *selection))
204
sokoke_widget_popup(webView, GTK_MENU(browser->popup_element), event);
206
sokoke_widget_popup(webView, GTK_MENU(browser->popup_webView), event);
209
gboolean on_webView_button_release(GtkWidget* webView, GdkEventButton* event
212
GdkModifierType state = (GdkModifierType)0;
214
gdk_window_get_pointer(NULL, &x, &y, &state);
215
switch(event->button)
218
if(!browser->elementUri) return FALSE;
219
if(state & GDK_SHIFT_MASK)
221
// Open link in new window
222
CBrowser* curBrowser = browser_new(NULL);
223
webkit_web_view_open(WEBKIT_WEB_VIEW(curBrowser->webView), browser->elementUri);
226
else if(state & GDK_MOD1_MASK)
228
// Open link in new tab
229
CBrowser* curBrowser = browser_new(browser);
230
webkit_web_view_open(WEBKIT_WEB_VIEW(curBrowser->webView), browser->elementUri);
235
if(state & GDK_CONTROL_MASK)
237
//webkit_web_view_set_text_size(WEBKIT_WEB_VIEW(webView), 1);
242
if(!browser->elementUri) return FALSE;
243
// Open link in new tab
244
CBrowser* curBrowser = browser_new(browser);
245
webkit_web_view_open(WEBKIT_WEB_VIEW(curBrowser->webView), browser->elementUri);
250
webView_popup(webView, event, browser);
256
void on_webView_popup(GtkWidget* webView, CBrowser* browser)
258
webView_popup(webView, NULL, browser);
261
gboolean on_webView_scroll(GtkWidget* webView, GdkEventScroll* event
264
GdkModifierType state = (GdkModifierType)0;
266
gdk_window_get_pointer(NULL, &x, &y, &state);
267
if(state & GDK_CONTROL_MASK)
269
/*const gfloat size = webkit_web_view_get_text_size(WEBKIT_WEB_VIEW(webView));
270
if(event->direction == GDK_SCROLL_DOWN)
271
webkit_web_view_set_text_size(WEBKIT_WEB_VIEW(webView), size + 0.1);
272
else if(event->direction == GDK_SCROLL_UP)
273
webView_set_text_size(WEBKIT_WEB_VIEW(webView), size - 0.1);*/
280
gboolean on_webView_leave(GtkWidget* webView, GdkEventCrossing* event, CBrowser* browser)
282
update_status_message(NULL, browser);
286
void on_webView_destroy(GtkWidget* widget, CBrowser* browser)
288
// Update browser list, free memory and possibly quit
289
GList* tmp = g_list_find(browsers, browser);
290
browsers = g_list_delete_link(browsers, tmp);
291
g_free(browser->elementUri);
292
g_free(browser->statusMessage);
293
if(!g_list_length(browsers))
295
g_object_unref(browser->actiongroup);
296
g_object_unref(browser->popup_webView);
297
g_object_unref(browser->popup_element);
298
g_object_unref(browser->popup_editable);
303
// webView actions begin here
305
GtkWidget* webView_new(GtkWidget** scrolled)
307
*scrolled = gtk_scrolled_window_new(NULL, NULL);
308
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(*scrolled)
309
, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
310
GTK_WIDGET_SET_FLAGS(*scrolled, GTK_CAN_FOCUS);
311
GtkWidget* webView = webkit_web_view_new();
312
gtk_container_add(GTK_CONTAINER(*scrolled), webView);
316
void webView_open(GtkWidget* webView, const gchar* uri)
318
webkit_web_view_open(WEBKIT_WEB_VIEW(webView), (gchar*)uri);
319
// We need to check the browser first
320
// No browser means this is a panel
321
CBrowser* browser = get_browser_from_webView(webView);
324
xbel_bookmark_set_href(browser->sessionItem, uri);
325
xbel_item_set_title(browser->sessionItem, "");
329
void webView_close(GtkWidget* webView, CBrowser* browser)
331
browser = get_browser_from_webView(webView);
332
const gchar* uri = xbel_bookmark_get_href(browser->sessionItem);
333
xbel_folder_remove_item(session, browser->sessionItem);
336
xbel_folder_prepend_item(tabtrash, browser->sessionItem);
337
guint n = xbel_folder_get_n_items(tabtrash);
340
XbelItem* item = xbel_folder_get_nth_item(tabtrash, n - 1);
341
xbel_folder_remove_item(tabtrash, item);
342
xbel_item_free(item);
346
xbel_item_free(browser->sessionItem);
347
gtk_widget_destroy(browser->webView_menu);
348
gtk_notebook_remove_page(GTK_NOTEBOOK(browser->webViews)
349
, get_webView_index(webView, browser));
350
update_browser_actions(browser);