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 "videolink.hpp"
12 #include "wchar_t_short.h"
13 #include <gtkmozembed_internal.h>
14 #if MOZ_VERSION_GE(1,9,0)
15 #include <gtkmozembed_glue.cpp>
17 #include "wchar_t_default.h"
19 #include "xpcom_support.hpp"
21 using xpcom_support::check;
23 browser_widget::browser_widget()
24 : Gtk::Bin(GTK_BIN(gtk_moz_embed_new()))
27 browser_widget::~browser_widget()
31 GtkMozEmbed * browser_widget::gobj()
33 return GTK_MOZ_EMBED(gobject_);
35 const GtkMozEmbed * browser_widget::gobj() const
37 return GTK_MOZ_EMBED(gobject_);
40 void browser_widget::load_uri(const char * uri)
42 gtk_moz_embed_load_url(gobj(), uri);
44 void browser_widget::load_uri(const std::string & uri)
46 return load_uri(uri.c_str());
48 void browser_widget::stop_load()
50 gtk_moz_embed_stop_load(gobj());
52 void browser_widget::go_back()
54 gtk_moz_embed_go_back(gobj());
56 void browser_widget::go_forward()
58 gtk_moz_embed_go_forward(gobj());
60 void browser_widget::reload(gint32 flags)
62 gtk_moz_embed_reload(gobj(), flags);
65 bool browser_widget::can_go_back() const
67 return gtk_moz_embed_can_go_back(const_cast<GtkMozEmbed *>(gobj()));
69 bool browser_widget::can_go_forward() const
71 return gtk_moz_embed_can_go_forward(const_cast<GtkMozEmbed *>(gobj()));
80 explicit c_scoped_ptr(T * p = 0) : p_(p) {}
81 ~c_scoped_ptr() { free(p_); }
82 T * get() const { return p_; }
99 std::string browser_widget::get_link_message() const
101 c_scoped_ptr<char> str(
102 gtk_moz_embed_get_link_message(const_cast<GtkMozEmbed *>(gobj())));
103 return std::string(str.get());
105 std::string browser_widget::get_js_status() const
107 c_scoped_ptr<char> str(
108 gtk_moz_embed_get_js_status(const_cast<GtkMozEmbed *>(gobj())));
109 return std::string(str.get());
111 std::string browser_widget::get_title() const
113 c_scoped_ptr<char> str(
114 gtk_moz_embed_get_title(const_cast<GtkMozEmbed *>(gobj())));
115 return std::string(str.get());
117 std::string browser_widget::get_location() const
119 c_scoped_ptr<char> str(
120 gtk_moz_embed_get_location(const_cast<GtkMozEmbed *>(gobj())));
121 return std::string(str.get());
123 already_AddRefed<nsIWebBrowser> browser_widget::get_browser()
125 nsIWebBrowser * result = 0;
126 gtk_moz_embed_get_nsIWebBrowser(gobj(), &result);
128 return dont_AddRef(result);
133 void browser_widget_signal_link_message_callback(GtkMozEmbed * self, void * data)
135 typedef sigc::slot<void> SlotType;
137 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
141 if (sigc::slot_base * const slot =
142 Glib::SignalProxyNormal::data_to_slot(data))
143 (*static_cast<SlotType*>(slot))();
147 Glib::exception_handlers_invoke();
152 const Glib::SignalProxyInfo browser_widget_signal_link_message_info =
155 (GCallback) &browser_widget_signal_link_message_callback,
156 (GCallback) &browser_widget_signal_link_message_callback
159 void browser_widget_signal_js_status_callback(GtkMozEmbed * self, void * data)
161 typedef sigc::slot<void> SlotType;
163 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
167 if (sigc::slot_base * const slot =
168 Glib::SignalProxyNormal::data_to_slot(data))
169 (*static_cast<SlotType*>(slot))();
173 Glib::exception_handlers_invoke();
178 const Glib::SignalProxyInfo browser_widget_signal_js_status_info =
181 (GCallback) &browser_widget_signal_js_status_callback,
182 (GCallback) &browser_widget_signal_js_status_callback
185 void browser_widget_signal_location_callback(GtkMozEmbed * self, void * data)
187 typedef sigc::slot<void> SlotType;
189 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
193 if (sigc::slot_base * const slot =
194 Glib::SignalProxyNormal::data_to_slot(data))
195 (*static_cast<SlotType*>(slot))();
199 Glib::exception_handlers_invoke();
204 const Glib::SignalProxyInfo browser_widget_signal_location_info =
207 (GCallback) &browser_widget_signal_location_callback,
208 (GCallback) &browser_widget_signal_location_callback
211 void browser_widget_signal_title_callback(GtkMozEmbed * self, void * data)
213 typedef sigc::slot<void> SlotType;
215 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
219 if (sigc::slot_base * const slot =
220 Glib::SignalProxyNormal::data_to_slot(data))
221 (*static_cast<SlotType*>(slot))();
225 Glib::exception_handlers_invoke();
230 const Glib::SignalProxyInfo browser_widget_signal_title_info =
233 (GCallback) &browser_widget_signal_title_callback,
234 (GCallback) &browser_widget_signal_title_callback
237 void browser_widget_signal_progress_callback(
238 GtkMozEmbed * self, gint p0, gint p1, void * data)
240 typedef sigc::slot<void, gint, gint> SlotType;
242 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
246 if (sigc::slot_base * const slot =
247 Glib::SignalProxyNormal::data_to_slot(data))
248 (*static_cast<SlotType*>(slot))(p0, p1);
252 Glib::exception_handlers_invoke();
257 const Glib::SignalProxyInfo browser_widget_signal_progress_info =
260 (GCallback) &browser_widget_signal_progress_callback,
261 (GCallback) &browser_widget_signal_progress_callback
264 void browser_widget_signal_net_state_callback(
265 GtkMozEmbed * self, const char * p0, gint p1, guint p2, void * data)
267 typedef sigc::slot<void, const char *, gint, guint> SlotType;
269 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
273 if (sigc::slot_base * const slot =
274 Glib::SignalProxyNormal::data_to_slot(data))
275 (*static_cast<SlotType*>(slot))(p0, p1, p2);
279 Glib::exception_handlers_invoke();
284 const Glib::SignalProxyInfo browser_widget_signal_net_state_info =
287 (GCallback) &browser_widget_signal_net_state_callback,
288 (GCallback) &browser_widget_signal_net_state_callback
291 void browser_widget_signal_net_start_callback(GtkMozEmbed * self, void * data)
293 typedef sigc::slot<void> SlotType;
295 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
299 if (sigc::slot_base * const slot =
300 Glib::SignalProxyNormal::data_to_slot(data))
301 (*static_cast<SlotType*>(slot))();
305 Glib::exception_handlers_invoke();
310 const Glib::SignalProxyInfo browser_widget_signal_net_start_info =
313 (GCallback) &browser_widget_signal_net_start_callback,
314 (GCallback) &browser_widget_signal_net_start_callback
317 void browser_widget_signal_net_stop_callback(GtkMozEmbed * self, void * data)
319 typedef sigc::slot<void> SlotType;
321 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
325 if (sigc::slot_base * const slot =
326 Glib::SignalProxyNormal::data_to_slot(data))
327 (*static_cast<SlotType*>(slot))();
331 Glib::exception_handlers_invoke();
336 const Glib::SignalProxyInfo browser_widget_signal_net_stop_info =
339 (GCallback) &browser_widget_signal_net_stop_callback,
340 (GCallback) &browser_widget_signal_net_stop_callback
343 void browser_widget_signal_new_window_callback(
344 GtkMozEmbed * self, GtkMozEmbed ** p0, guint p1, void * data)
346 typedef sigc::slot<browser_widget *, guint> SlotType;
348 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
352 if (sigc::slot_base * const slot =
353 Glib::SignalProxyNormal::data_to_slot(data))
355 if (browser_widget * result =
356 (*static_cast<SlotType*>(slot))(p1))
358 *p0 = result->gobj();
365 Glib::exception_handlers_invoke();
373 const Glib::SignalProxyInfo browser_widget_signal_new_window_info =
376 (GCallback) &browser_widget_signal_new_window_callback,
377 (GCallback) &browser_widget_signal_new_window_callback
380 void browser_widget_signal_visibility_callback(
381 GtkMozEmbed * self, gboolean p0, void * data)
383 typedef sigc::slot<void, bool> SlotType;
385 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
389 if (sigc::slot_base * const slot =
390 Glib::SignalProxyNormal::data_to_slot(data))
391 (*static_cast<SlotType*>(slot))(p0);
395 Glib::exception_handlers_invoke();
400 const Glib::SignalProxyInfo browser_widget_signal_visibility_info =
403 (GCallback) &browser_widget_signal_visibility_callback,
404 (GCallback) &browser_widget_signal_visibility_callback
407 void browser_widget_signal_destroy_browser_callback(
408 GtkMozEmbed * self, void * data)
410 typedef sigc::slot<void> SlotType;
412 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
416 if (sigc::slot_base * const slot =
417 Glib::SignalProxyNormal::data_to_slot(data))
418 (*static_cast<SlotType*>(slot))();
422 Glib::exception_handlers_invoke();
427 const Glib::SignalProxyInfo browser_widget_signal_destroy_info =
430 (GCallback) &browser_widget_signal_destroy_browser_callback,
431 (GCallback) &browser_widget_signal_destroy_browser_callback
434 gint browser_widget_signal_open_uri_callback(
435 GtkMozEmbed * self, const char * p0, void * data)
437 typedef sigc::slot<bool, const char *> SlotType;
439 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
443 if (sigc::slot_base * const slot =
444 Glib::SignalProxyNormal::data_to_slot(data))
445 return (*static_cast<SlotType*>(slot))(p0);
449 Glib::exception_handlers_invoke();
456 const Glib::SignalProxyInfo browser_widget_signal_open_uri_info =
459 (GCallback) &browser_widget_signal_open_uri_callback,
460 (GCallback) &browser_widget_signal_open_uri_callback
465 Glib::SignalProxy0<void> browser_widget::signal_link_message()
467 return Glib::SignalProxy0<void>(this, &browser_widget_signal_link_message_info);
469 Glib::SignalProxy0<void> browser_widget::signal_js_status()
471 return Glib::SignalProxy0<void>(this, &browser_widget_signal_js_status_info);
473 Glib::SignalProxy0<void> browser_widget::signal_location()
475 return Glib::SignalProxy0<void>(this, &browser_widget_signal_location_info);
477 Glib::SignalProxy0<void> browser_widget::signal_title()
479 return Glib::SignalProxy0<void>(this, &browser_widget_signal_title_info);
481 Glib::SignalProxy2<void, gint /*cur*/, gint /*max*/> browser_widget::signal_progress()
483 return Glib::SignalProxy2<void, gint, gint>(
484 this, &browser_widget_signal_progress_info);
486 Glib::SignalProxy3<void, const char *, gint /*flags*/, guint /*status*/>
487 browser_widget::signal_net_state()
489 return Glib::SignalProxy3<void, const char *, gint, guint>(
490 this, &browser_widget_signal_net_state_info);
492 Glib::SignalProxy0<void> browser_widget::signal_net_start()
494 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_start_info);
496 Glib::SignalProxy0<void> browser_widget::signal_net_stop()
498 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_stop_info);
500 Glib::SignalProxy1<browser_widget *, guint /*chromemask*/> browser_widget::signal_new_window()
502 return Glib::SignalProxy1<browser_widget *, guint>(
503 this, &browser_widget_signal_new_window_info);
505 Glib::SignalProxy1<void, bool /*visibility*/> browser_widget::signal_visibility()
507 return Glib::SignalProxy1<void, bool>(
508 this, &browser_widget_signal_visibility_info);
510 Glib::SignalProxy0<void> browser_widget::signal_destroy()
512 return Glib::SignalProxy0<void>(this, &browser_widget_signal_destroy_info);
514 Glib::SignalProxy1<bool, const char * /*uri*/> browser_widget::signal_open_uri()
516 return Glib::SignalProxy1<bool, const char *>(
517 this, &browser_widget_signal_open_uri_info);
520 browser_widget::browser_widget(GObject * gobject, bool take_copy)
522 assert(GTK_MOZ_EMBED(gobject));
527 Glib::ObjectBase * browser_widget::wrap_new(GObject * gobject)
529 return new browser_widget(gobject, false);
532 browser_widget::initialiser::initialiser()
534 #if MOZ_VERSION_GE(1,9,0)
535 static const GREVersionRange gre_versions = {
536 #if MOZ_VERSION_EQ(1,9,0)
539 #elif MOZ_VERSION_EQ(1,9,1)
542 #elif MOZ_VERSION_EQ(2,0,-1) || MOZ_VERSION_EQ(2,0,0)
545 #elif MOZ_VERSION_EQ(2,0,1)
549 #error "version is unsupported, but you could try continuing the pattern above"
553 check(GRE_GetGREPathWithProperties(&gre_versions, 1, 0, 0,
554 path, sizeof(path)));
556 check(XPCOMGlueStartup(path));
557 check(GTKEmbedGlueStartup());
558 check(GTKEmbedGlueStartupInternal());
560 char * last_slash = std::strrchr(path, '/');
561 if (last_slash != path)
563 gtk_moz_embed_set_path(path);
565 gtk_moz_embed_set_comp_path(MOZ_LIB_DIR);
568 gtk_moz_embed_push_startup();
570 wrap_register(gtk_moz_embed_get_type(), wrap_new);
573 browser_widget::initialiser::~initialiser()
575 gtk_moz_embed_pop_startup();
577 #if MOZ_VERSION_GE(1,9,0)
584 browser_widget * wrap(GtkMozEmbed * object, bool take_copy)
586 return dynamic_cast<browser_widget *>(
587 Glib::wrap_auto((GObject*)(object), take_copy));