1 // Copyright 2005-8 Ben Hutchings <ben@decadent.org.uk>.
2 // See the file "COPYING" for licence details.
4 #include "browser_widget.hpp"
11 #include "wchar_t_short.h"
12 #include <gtkmozembed_internal.h>
13 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
14 #include <gtkmozembed_glue.cpp>
16 #include "wchar_t_default.h"
18 #include "xpcom_support.hpp"
20 using xpcom_support::check;
22 browser_widget::browser_widget()
23 : Gtk::Bin(GTK_BIN(gtk_moz_embed_new()))
26 browser_widget::~browser_widget()
30 GtkMozEmbed * browser_widget::gobj()
32 return GTK_MOZ_EMBED(gobject_);
34 const GtkMozEmbed * browser_widget::gobj() const
36 return GTK_MOZ_EMBED(gobject_);
39 void browser_widget::load_uri(const char * uri)
41 gtk_moz_embed_load_url(gobj(), uri);
43 void browser_widget::load_uri(const std::string & uri)
45 return load_uri(uri.c_str());
47 void browser_widget::stop_load()
49 gtk_moz_embed_stop_load(gobj());
51 void browser_widget::go_back()
53 gtk_moz_embed_go_back(gobj());
55 void browser_widget::go_forward()
57 gtk_moz_embed_go_forward(gobj());
59 void browser_widget::reload(gint32 flags)
61 gtk_moz_embed_reload(gobj(), flags);
64 bool browser_widget::can_go_back() const
66 return gtk_moz_embed_can_go_back(const_cast<GtkMozEmbed *>(gobj()));
68 bool browser_widget::can_go_forward() const
70 return gtk_moz_embed_can_go_forward(const_cast<GtkMozEmbed *>(gobj()));
79 explicit c_scoped_ptr(T * p = 0) : p_(p) {}
80 ~c_scoped_ptr() { free(p_); }
81 T * get() const { return p_; }
98 std::string browser_widget::get_link_message() const
100 c_scoped_ptr<char> str(
101 gtk_moz_embed_get_link_message(const_cast<GtkMozEmbed *>(gobj())));
102 return std::string(str.get());
104 std::string browser_widget::get_js_status() const
106 c_scoped_ptr<char> str(
107 gtk_moz_embed_get_js_status(const_cast<GtkMozEmbed *>(gobj())));
108 return std::string(str.get());
110 std::string browser_widget::get_title() const
112 c_scoped_ptr<char> str(
113 gtk_moz_embed_get_title(const_cast<GtkMozEmbed *>(gobj())));
114 return std::string(str.get());
116 std::string browser_widget::get_location() const
118 c_scoped_ptr<char> str(
119 gtk_moz_embed_get_location(const_cast<GtkMozEmbed *>(gobj())));
120 return std::string(str.get());
122 already_AddRefed<nsIWebBrowser> browser_widget::get_browser()
124 nsIWebBrowser * result = 0;
125 gtk_moz_embed_get_nsIWebBrowser(gobj(), &result);
127 return dont_AddRef(result);
132 void browser_widget_signal_link_message_callback(GtkMozEmbed * self, void * data)
134 typedef sigc::slot<void> SlotType;
136 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
140 if (sigc::slot_base * const slot =
141 Glib::SignalProxyNormal::data_to_slot(data))
142 (*static_cast<SlotType*>(slot))();
146 Glib::exception_handlers_invoke();
151 const Glib::SignalProxyInfo browser_widget_signal_link_message_info =
154 (GCallback) &browser_widget_signal_link_message_callback,
155 (GCallback) &browser_widget_signal_link_message_callback
158 void browser_widget_signal_js_status_callback(GtkMozEmbed * self, void * data)
160 typedef sigc::slot<void> SlotType;
162 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
166 if (sigc::slot_base * const slot =
167 Glib::SignalProxyNormal::data_to_slot(data))
168 (*static_cast<SlotType*>(slot))();
172 Glib::exception_handlers_invoke();
177 const Glib::SignalProxyInfo browser_widget_signal_js_status_info =
180 (GCallback) &browser_widget_signal_js_status_callback,
181 (GCallback) &browser_widget_signal_js_status_callback
184 void browser_widget_signal_location_callback(GtkMozEmbed * self, void * data)
186 typedef sigc::slot<void> SlotType;
188 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
192 if (sigc::slot_base * const slot =
193 Glib::SignalProxyNormal::data_to_slot(data))
194 (*static_cast<SlotType*>(slot))();
198 Glib::exception_handlers_invoke();
203 const Glib::SignalProxyInfo browser_widget_signal_location_info =
206 (GCallback) &browser_widget_signal_location_callback,
207 (GCallback) &browser_widget_signal_location_callback
210 void browser_widget_signal_title_callback(GtkMozEmbed * self, void * data)
212 typedef sigc::slot<void> SlotType;
214 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
218 if (sigc::slot_base * const slot =
219 Glib::SignalProxyNormal::data_to_slot(data))
220 (*static_cast<SlotType*>(slot))();
224 Glib::exception_handlers_invoke();
229 const Glib::SignalProxyInfo browser_widget_signal_title_info =
232 (GCallback) &browser_widget_signal_title_callback,
233 (GCallback) &browser_widget_signal_title_callback
236 void browser_widget_signal_progress_callback(
237 GtkMozEmbed * self, gint p0, gint p1, void * data)
239 typedef sigc::slot<void, gint, gint> SlotType;
241 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
245 if (sigc::slot_base * const slot =
246 Glib::SignalProxyNormal::data_to_slot(data))
247 (*static_cast<SlotType*>(slot))(p0, p1);
251 Glib::exception_handlers_invoke();
256 const Glib::SignalProxyInfo browser_widget_signal_progress_info =
259 (GCallback) &browser_widget_signal_progress_callback,
260 (GCallback) &browser_widget_signal_progress_callback
263 void browser_widget_signal_net_state_callback(
264 GtkMozEmbed * self, const char * p0, gint p1, guint p2, void * data)
266 typedef sigc::slot<void, const char *, gint, guint> SlotType;
268 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
272 if (sigc::slot_base * const slot =
273 Glib::SignalProxyNormal::data_to_slot(data))
274 (*static_cast<SlotType*>(slot))(p0, p1, p2);
278 Glib::exception_handlers_invoke();
283 const Glib::SignalProxyInfo browser_widget_signal_net_state_info =
286 (GCallback) &browser_widget_signal_net_state_callback,
287 (GCallback) &browser_widget_signal_net_state_callback
290 void browser_widget_signal_net_start_callback(GtkMozEmbed * self, void * data)
292 typedef sigc::slot<void> SlotType;
294 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
298 if (sigc::slot_base * const slot =
299 Glib::SignalProxyNormal::data_to_slot(data))
300 (*static_cast<SlotType*>(slot))();
304 Glib::exception_handlers_invoke();
309 const Glib::SignalProxyInfo browser_widget_signal_net_start_info =
312 (GCallback) &browser_widget_signal_net_start_callback,
313 (GCallback) &browser_widget_signal_net_start_callback
316 void browser_widget_signal_net_stop_callback(GtkMozEmbed * self, void * data)
318 typedef sigc::slot<void> SlotType;
320 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
324 if (sigc::slot_base * const slot =
325 Glib::SignalProxyNormal::data_to_slot(data))
326 (*static_cast<SlotType*>(slot))();
330 Glib::exception_handlers_invoke();
335 const Glib::SignalProxyInfo browser_widget_signal_net_stop_info =
338 (GCallback) &browser_widget_signal_net_stop_callback,
339 (GCallback) &browser_widget_signal_net_stop_callback
342 void browser_widget_signal_new_window_callback(
343 GtkMozEmbed * self, GtkMozEmbed ** p0, guint p1, void * data)
345 typedef sigc::slot<browser_widget *, guint> SlotType;
347 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
351 if (sigc::slot_base * const slot =
352 Glib::SignalProxyNormal::data_to_slot(data))
354 if (browser_widget * result =
355 (*static_cast<SlotType*>(slot))(p1))
357 *p0 = result->gobj();
364 Glib::exception_handlers_invoke();
372 const Glib::SignalProxyInfo browser_widget_signal_new_window_info =
375 (GCallback) &browser_widget_signal_new_window_callback,
376 (GCallback) &browser_widget_signal_new_window_callback
379 void browser_widget_signal_visibility_callback(
380 GtkMozEmbed * self, gboolean p0, void * data)
382 typedef sigc::slot<void, bool> SlotType;
384 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
388 if (sigc::slot_base * const slot =
389 Glib::SignalProxyNormal::data_to_slot(data))
390 (*static_cast<SlotType*>(slot))(p0);
394 Glib::exception_handlers_invoke();
399 const Glib::SignalProxyInfo browser_widget_signal_visibility_info =
402 (GCallback) &browser_widget_signal_visibility_callback,
403 (GCallback) &browser_widget_signal_visibility_callback
406 void browser_widget_signal_destroy_browser_callback(
407 GtkMozEmbed * self, void * data)
409 typedef sigc::slot<void> SlotType;
411 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
415 if (sigc::slot_base * const slot =
416 Glib::SignalProxyNormal::data_to_slot(data))
417 (*static_cast<SlotType*>(slot))();
421 Glib::exception_handlers_invoke();
426 const Glib::SignalProxyInfo browser_widget_signal_destroy_info =
429 (GCallback) &browser_widget_signal_destroy_browser_callback,
430 (GCallback) &browser_widget_signal_destroy_browser_callback
433 gint browser_widget_signal_open_uri_callback(
434 GtkMozEmbed * self, const char * p0, void * data)
436 typedef sigc::slot<bool, const char *> SlotType;
438 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
442 if (sigc::slot_base * const slot =
443 Glib::SignalProxyNormal::data_to_slot(data))
444 return (*static_cast<SlotType*>(slot))(p0);
448 Glib::exception_handlers_invoke();
455 const Glib::SignalProxyInfo browser_widget_signal_open_uri_info =
458 (GCallback) &browser_widget_signal_open_uri_callback,
459 (GCallback) &browser_widget_signal_open_uri_callback
464 Glib::SignalProxy0<void> browser_widget::signal_link_message()
466 return Glib::SignalProxy0<void>(this, &browser_widget_signal_link_message_info);
468 Glib::SignalProxy0<void> browser_widget::signal_js_status()
470 return Glib::SignalProxy0<void>(this, &browser_widget_signal_js_status_info);
472 Glib::SignalProxy0<void> browser_widget::signal_location()
474 return Glib::SignalProxy0<void>(this, &browser_widget_signal_location_info);
476 Glib::SignalProxy0<void> browser_widget::signal_title()
478 return Glib::SignalProxy0<void>(this, &browser_widget_signal_title_info);
480 Glib::SignalProxy2<void, gint /*cur*/, gint /*max*/> browser_widget::signal_progress()
482 return Glib::SignalProxy2<void, gint, gint>(
483 this, &browser_widget_signal_progress_info);
485 Glib::SignalProxy3<void, const char *, gint /*flags*/, guint /*status*/>
486 browser_widget::signal_net_state()
488 return Glib::SignalProxy3<void, const char *, gint, guint>(
489 this, &browser_widget_signal_net_state_info);
491 Glib::SignalProxy0<void> browser_widget::signal_net_start()
493 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_start_info);
495 Glib::SignalProxy0<void> browser_widget::signal_net_stop()
497 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_stop_info);
499 Glib::SignalProxy1<browser_widget *, guint /*chromemask*/> browser_widget::signal_new_window()
501 return Glib::SignalProxy1<browser_widget *, guint>(
502 this, &browser_widget_signal_new_window_info);
504 Glib::SignalProxy1<void, bool /*visibility*/> browser_widget::signal_visibility()
506 return Glib::SignalProxy1<void, bool>(
507 this, &browser_widget_signal_visibility_info);
509 Glib::SignalProxy0<void> browser_widget::signal_destroy()
511 return Glib::SignalProxy0<void>(this, &browser_widget_signal_destroy_info);
513 Glib::SignalProxy1<bool, const char * /*uri*/> browser_widget::signal_open_uri()
515 return Glib::SignalProxy1<bool, const char *>(
516 this, &browser_widget_signal_open_uri_info);
519 browser_widget::browser_widget(GObject * gobject, bool take_copy)
521 assert(GTK_MOZ_EMBED(gobject));
526 Glib::ObjectBase * browser_widget::wrap_new(GObject * gobject)
528 return new browser_widget(gobject, false);
531 browser_widget::initialiser::initialiser()
533 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
534 static const GREVersionRange gre_versions = {
535 #if MOZ_VERSION_MICRO == 0
538 #elif MOZ_VERSION_MICRO == 1
542 #error "version is unsupported, but you could try continuing the pattern above"
546 check(GRE_GetGREPathWithProperties(&gre_versions, 1, 0, 0,
547 path, sizeof(path)));
549 check(XPCOMGlueStartup(path));
550 check(GTKEmbedGlueStartup());
551 check(GTKEmbedGlueStartupInternal());
553 char * last_slash = std::strrchr(path, '/');
554 if (last_slash != path)
556 gtk_moz_embed_set_path(path);
558 gtk_moz_embed_set_comp_path(MOZ_LIB_DIR);
561 gtk_moz_embed_push_startup();
563 wrap_register(gtk_moz_embed_get_type(), wrap_new);
566 browser_widget::initialiser::~initialiser()
568 gtk_moz_embed_pop_startup();
570 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
577 browser_widget * wrap(GtkMozEmbed * object, bool take_copy)
579 return dynamic_cast<browser_widget *>(
580 Glib::wrap_auto((GObject*)(object), take_copy));