8 #include <yui/Libyui_config.h>
11 #include "ygtkhtmlwrap.h"
14 void ygutils_scrollAdj (GtkAdjustment *vadj, gboolean top);
16 GtkWidget *ygtk_html_wrap_new (
void)
18 GtkWidget *widget = g_object_new (ygtk_html_wrap_get_type(), NULL);
19 ygtk_html_wrap_init (widget);
25 #include <webkit/webkit.h>
27 GType ygtk_html_wrap_get_type()
29 return WEBKIT_TYPE_WEB_VIEW;
32 static void copy_activate_cb (GtkMenuItem *item, WebKitWebView *view)
33 { webkit_web_view_copy_clipboard (view); }
34 static void select_all_activate_cb (GtkMenuItem *item, WebKitWebView *view)
35 { webkit_web_view_select_all (view); }
37 static gboolean button_press_event_cb (GtkWidget *widget, GdkEventButton *event,
40 if (event && event->button != 3)
43 static GtkWidget *menu = 0;
45 gtk_widget_destroy (menu);
46 menu = gtk_menu_new();
49 item = gtk_image_menu_item_new_from_stock (GTK_STOCK_COPY, NULL);
50 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
51 if (webkit_web_view_can_copy_clipboard (view))
52 g_signal_connect (item,
"activate", G_CALLBACK (copy_activate_cb), widget);
54 gtk_widget_set_sensitive (item, FALSE);
55 item = gtk_separator_menu_item_new();
56 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
57 item = gtk_image_menu_item_new_from_stock (GTK_STOCK_SELECT_ALL, NULL);
58 gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
59 g_signal_connect (item,
"activate", G_CALLBACK (select_all_activate_cb), widget);
61 int button, event_time;
63 button =
event->button;
64 event_time =
event->time;
68 event_time = gtk_get_current_event_time();
70 gtk_menu_attach_to_widget (GTK_MENU (menu), widget, NULL);
71 gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, button, event_time);
72 gtk_widget_show_all (menu);
76 static gboolean popup_menu_cb (GtkWidget *widget, WebKitWebView *view)
78 button_press_event_cb (widget, NULL, view);
82 static gboolean button_release_event_cb (GtkWidget *widget, GdkEventButton *event)
84 if (event->button != 3)
return FALSE;
88 void ygtk_html_wrap_init (GtkWidget *widget)
92 g_signal_connect (G_OBJECT (widget),
"popup-menu",
93 G_CALLBACK (popup_menu_cb), widget);
94 g_signal_connect (G_OBJECT (widget),
"button-press-event",
95 G_CALLBACK (button_press_event_cb), widget);
97 g_signal_connect (G_OBJECT (widget),
"button-release-event",
98 G_CALLBACK (button_release_event_cb), widget);
102 const char *CSS =
"<style type=\"text/css\">"
103 "h1 { color: #5c5c5c; font-size: xx-large; font-weight: 900; border-bottom: thin solid cdcfd1; }"
104 "h2 { color: #5c5c5c; font-size: x-large; font-weight: 800; border-bottom: thin solid cdcfd1; }"
105 "h3 { color: #5c5c5c; font-size: large; font-weight: 700; border-bottom: thin solid cdcfd1; }"
106 "h4 { color: #5c5c5c; font-size: large; font-weight: 600; }"
107 "h5 { color: #5c5c5c; font-size: large; }"
108 "pre { background-color: #f0f0f0; border: thin solid #bfbfbf; padding: 2px; }"
109 "a { text-decoration: none; }"
110 "a:hover { text-decoration: underline; }"
113 void ygtk_html_wrap_set_text (GtkWidget *widget,
const gchar *text, gboolean plain_mode)
115 WebKitWebView *view = WEBKIT_WEB_VIEW (widget);
118 webkit_web_view_load_string (view, text,
"text/plain",
"UTF-8",
"/");
122 for (i = 0; text[i]; i++) {
123 if (!strncmp (text+i,
"href=", 5)) {
128 for (j = i; text[j] && text[j] !=
':'; j++)
129 if (text[j] ==
'"' || g_ascii_isspace (text[j])) {
131 str = g_string_new (
"");
132 str = g_string_append_len (str, text+last_i, i-last_i);
134 str = g_string_append (str,
"label:/");
140 str = g_string_append (str, text+last_i);
141 text = g_string_free (str, FALSE);
144 const gchar *extra_css = g_object_get_data (G_OBJECT (widget),
"extra-css");
145 if (!extra_css) extra_css =
"";
147 gchar *html = g_strdup_printf (
"%s\n%s\n%s", CSS, extra_css, text);
149 g_free ((gchar *) text);
150 webkit_web_view_load_string (view, html,
"text/html",
"UTF-8",
"/");
155 void ygtk_html_wrap_scroll (GtkWidget *widget, gboolean top)
157 GtkWidget *scroll_win = gtk_widget_get_parent (widget);
158 ygutils_scrollAdj (gtk_scrolled_window_get_vadjustment (
159 GTK_SCROLLED_WINDOW (scroll_win)), top);
162 gboolean ygtk_html_wrap_search (GtkWidget *widget,
const gchar *text)
164 WebKitWebView *view = WEBKIT_WEB_VIEW (widget);
165 webkit_web_view_unmark_text_matches (view);
167 gboolean found = webkit_web_view_mark_text_matches (view, text, FALSE, -1);
168 webkit_web_view_set_highlight_text_matches (view, TRUE);
170 ygtk_html_wrap_search_next (widget, text);
177 gboolean ygtk_html_wrap_search_next (GtkWidget *widget,
const gchar *text)
179 WebKitWebView *view = WEBKIT_WEB_VIEW (widget);
180 return webkit_web_view_search_text (view, text, FALSE, TRUE, TRUE);
183 static WebKitNavigationResponse ygtk_webkit_navigation_requested_cb (
184 WebKitWebView *view, WebKitWebFrame *frame, WebKitNetworkRequest *request, LinkClickedCb callback)
186 const gchar *uri = webkit_network_request_get_uri (request);
189 if (!strncmp (uri,
"label:/",
sizeof (
"label:/")-1))
190 uri = uri +
sizeof (
"label:/")-1;
191 gpointer data = g_object_get_data (G_OBJECT (view),
"pointer");
192 (*callback) (GTK_WIDGET (view), uri, data);
193 return WEBKIT_NAVIGATION_RESPONSE_IGNORE;
196 void ygtk_html_wrap_connect_link_clicked (GtkWidget *widget, LinkClickedCb callback, gpointer data)
198 g_object_set_data (G_OBJECT (widget),
"pointer", data);
199 g_signal_connect (G_OBJECT (widget),
"navigation-requested",
200 G_CALLBACK (ygtk_webkit_navigation_requested_cb), callback);
203 void ygtk_html_wrap_set_background (GtkWidget *widget, GdkPixbuf *pixbuf,
const gchar *filename)
205 int width = gdk_pixbuf_get_width (pixbuf);
206 gchar *bg_css = g_strdup_printf (
207 "<style type=\"text/css\">"
208 "body { background-image: url('%s'); background-repeat: no-repeat;"
209 "background-position: %dpx 100%%; background-attachment: fixed; }"
210 "</style>", filename, -width+40);
211 g_object_set_data_full (G_OBJECT (widget),
"extra-css", bg_css, g_free);
218 #include <gtkhtml/gtkhtml.h>
219 #include <gtkhtml/gtkhtml-stream.h>
220 #include <gtkhtml/gtkhtml-search.h>
222 GType ygtk_html_wrap_get_type (
void)
224 return GTK_TYPE_HTML;
227 static void gtkhtml_url_requested_cb (GtkHTML *html,
const gchar *url, GtkHTMLStream *stream)
229 FILE *file = fopen (url,
"rb");
231 g_warning (
"Error: couldn't open file '%s'\n", url);
235 fseek (file, 0, SEEK_END);
236 size_t file_size = ftell (file);
240 gchar *data = g_new (gchar, file_size);
241 error = fread (data, 1, file_size, file) < file_size;
245 gtk_html_stream_write (stream, data, file_size);
249 void ygtk_html_wrap_init (GtkWidget *widget)
251 gtk_html_set_editable (GTK_HTML (widget), FALSE);
252 g_signal_connect (G_OBJECT (widget),
"url-requested",
253 G_CALLBACK (gtkhtml_url_requested_cb), NULL);
256 void ygtk_html_wrap_set_text (GtkWidget *widget,
const gchar* text, gboolean plain_mode)
259 GtkHTMLStream *stream = gtk_html_begin (GTK_HTML (widget));
260 gtk_html_write (GTK_HTML (widget), stream, text, strlen (text));
261 gtk_html_end (GTK_HTML (widget), stream, GTK_HTML_STREAM_OK);
264 void ygtk_html_wrap_scroll (GtkWidget *widget, gboolean top)
266 ygutils_scrollAdj (GTK_LAYOUT (widget)->vadjustment, top);
269 gboolean ygtk_html_wrap_search (GtkWidget *widget,
const gchar *text)
273 return gtk_html_engine_search (GTK_HTML (widget), text, FALSE, TRUE, FALSE);
276 gboolean ygtk_html_wrap_search_next (GtkWidget *widget,
const gchar *text)
278 return gtk_html_engine_search_next (GTK_HTML (widget));
281 void ygtk_html_wrap_connect_link_clicked (GtkWidget *widget, LinkClickedCb callback, gpointer data)
283 g_signal_connect (G_OBJECT (widget),
"link-clicked", G_CALLBACK (callback), data);
286 void ygtk_html_wrap_set_background (GtkWidget *widget, GdkPixbuf *pixbuf,
const gchar *filename)
293 #include "ygtkrichtext.h"
295 GType ygtk_html_wrap_get_type()
297 return YGTK_TYPE_RICH_TEXT;
300 void ygtk_html_wrap_init (GtkWidget *widget)
304 void ygtk_html_wrap_set_text (GtkWidget *widget,
const gchar* text, gboolean plain_mode)
308 ygtk_rich_text_set_plain_text (rtext, text);
310 ygtk_rich_text_set_text (rtext, text);
313 void ygtk_html_wrap_scroll (GtkWidget *widget, gboolean top)
315 ygutils_scrollAdj (gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (widget)), top);
318 gboolean ygtk_html_wrap_search (GtkWidget *widget,
const gchar *text)
320 gboolean ret = ygtk_rich_text_mark_text (YGTK_RICH_TEXT (widget), text);
321 ygtk_rich_text_forward_mark (YGTK_RICH_TEXT (widget), text);
325 gboolean ygtk_html_wrap_search_next (GtkWidget *widget,
const gchar *text)
327 return ygtk_rich_text_forward_mark (YGTK_RICH_TEXT (widget), text);
330 void ygtk_html_wrap_connect_link_clicked (GtkWidget *widget, LinkClickedCb callback, gpointer data)
332 g_signal_connect (G_OBJECT (widget),
"link-clicked", G_CALLBACK (callback), data);
335 void ygtk_html_wrap_set_background (GtkWidget *widget, GdkPixbuf *pixbuf,
const gchar *filename)
337 ygtk_rich_text_set_background (YGTK_RICH_TEXT (widget), pixbuf);