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 <gtkmozembed_internal.h>
12 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
13 #include <gtkmozembed_glue.cpp>
16 #include "xpcom_support.hpp"
18 using xpcom_support::check;
20 browser_widget::browser_widget()
21 : Gtk::Bin(GTK_BIN(gtk_moz_embed_new()))
24 browser_widget::~browser_widget()
28 GtkMozEmbed * browser_widget::gobj()
30 return GTK_MOZ_EMBED(gobject_);
32 const GtkMozEmbed * browser_widget::gobj() const
34 return GTK_MOZ_EMBED(gobject_);
37 void browser_widget::load_uri(const char * uri)
39 gtk_moz_embed_load_url(gobj(), uri);
41 void browser_widget::load_uri(const std::string & uri)
43 return load_uri(uri.c_str());
45 void browser_widget::stop_load()
47 gtk_moz_embed_stop_load(gobj());
49 void browser_widget::go_back()
51 gtk_moz_embed_go_back(gobj());
53 void browser_widget::go_forward()
55 gtk_moz_embed_go_forward(gobj());
57 void browser_widget::reload(gint32 flags)
59 gtk_moz_embed_reload(gobj(), flags);
62 bool browser_widget::can_go_back() const
64 return gtk_moz_embed_can_go_back(const_cast<GtkMozEmbed *>(gobj()));
66 bool browser_widget::can_go_forward() const
68 return gtk_moz_embed_can_go_forward(const_cast<GtkMozEmbed *>(gobj()));
77 explicit c_scoped_ptr(T * p = 0) : p_(p) {}
78 ~c_scoped_ptr() { free(p_); }
79 T * get() const { return p_; }
96 std::string browser_widget::get_link_message() const
98 c_scoped_ptr<char> str(
99 gtk_moz_embed_get_link_message(const_cast<GtkMozEmbed *>(gobj())));
100 return std::string(str.get());
102 std::string browser_widget::get_js_status() const
104 c_scoped_ptr<char> str(
105 gtk_moz_embed_get_js_status(const_cast<GtkMozEmbed *>(gobj())));
106 return std::string(str.get());
108 std::string browser_widget::get_title() const
110 c_scoped_ptr<char> str(
111 gtk_moz_embed_get_title(const_cast<GtkMozEmbed *>(gobj())));
112 return std::string(str.get());
114 std::string browser_widget::get_location() const
116 c_scoped_ptr<char> str(
117 gtk_moz_embed_get_location(const_cast<GtkMozEmbed *>(gobj())));
118 return std::string(str.get());
120 already_AddRefed<nsIWebBrowser> browser_widget::get_browser()
122 nsIWebBrowser * result = 0;
123 gtk_moz_embed_get_nsIWebBrowser(gobj(), &result);
125 return dont_AddRef(result);
130 void browser_widget_signal_link_message_callback(GtkMozEmbed * self, void * data)
132 typedef sigc::slot<void> SlotType;
134 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
138 if (sigc::slot_base * const slot =
139 Glib::SignalProxyNormal::data_to_slot(data))
140 (*static_cast<SlotType*>(slot))();
144 Glib::exception_handlers_invoke();
149 const Glib::SignalProxyInfo browser_widget_signal_link_message_info =
152 (GCallback) &browser_widget_signal_link_message_callback,
153 (GCallback) &browser_widget_signal_link_message_callback
156 void browser_widget_signal_js_status_callback(GtkMozEmbed * self, void * data)
158 typedef sigc::slot<void> SlotType;
160 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
164 if (sigc::slot_base * const slot =
165 Glib::SignalProxyNormal::data_to_slot(data))
166 (*static_cast<SlotType*>(slot))();
170 Glib::exception_handlers_invoke();
175 const Glib::SignalProxyInfo browser_widget_signal_js_status_info =
178 (GCallback) &browser_widget_signal_js_status_callback,
179 (GCallback) &browser_widget_signal_js_status_callback
182 void browser_widget_signal_location_callback(GtkMozEmbed * self, void * data)
184 typedef sigc::slot<void> SlotType;
186 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
190 if (sigc::slot_base * const slot =
191 Glib::SignalProxyNormal::data_to_slot(data))
192 (*static_cast<SlotType*>(slot))();
196 Glib::exception_handlers_invoke();
201 const Glib::SignalProxyInfo browser_widget_signal_location_info =
204 (GCallback) &browser_widget_signal_location_callback,
205 (GCallback) &browser_widget_signal_location_callback
208 void browser_widget_signal_title_callback(GtkMozEmbed * self, void * data)
210 typedef sigc::slot<void> SlotType;
212 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
216 if (sigc::slot_base * const slot =
217 Glib::SignalProxyNormal::data_to_slot(data))
218 (*static_cast<SlotType*>(slot))();
222 Glib::exception_handlers_invoke();
227 const Glib::SignalProxyInfo browser_widget_signal_title_info =
230 (GCallback) &browser_widget_signal_title_callback,
231 (GCallback) &browser_widget_signal_title_callback
234 void browser_widget_signal_progress_callback(
235 GtkMozEmbed * self, gint p0, gint p1, void * data)
237 typedef sigc::slot<void, gint, gint> SlotType;
239 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
243 if (sigc::slot_base * const slot =
244 Glib::SignalProxyNormal::data_to_slot(data))
245 (*static_cast<SlotType*>(slot))(p0, p1);
249 Glib::exception_handlers_invoke();
254 const Glib::SignalProxyInfo browser_widget_signal_progress_info =
257 (GCallback) &browser_widget_signal_progress_callback,
258 (GCallback) &browser_widget_signal_progress_callback
261 void browser_widget_signal_net_state_callback(
262 GtkMozEmbed * self, const char * p0, gint p1, guint p2, void * data)
264 typedef sigc::slot<void, const char *, gint, guint> SlotType;
266 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
270 if (sigc::slot_base * const slot =
271 Glib::SignalProxyNormal::data_to_slot(data))
272 (*static_cast<SlotType*>(slot))(p0, p1, p2);
276 Glib::exception_handlers_invoke();
281 const Glib::SignalProxyInfo browser_widget_signal_net_state_info =
284 (GCallback) &browser_widget_signal_net_state_callback,
285 (GCallback) &browser_widget_signal_net_state_callback
288 void browser_widget_signal_net_start_callback(GtkMozEmbed * self, void * data)
290 typedef sigc::slot<void> SlotType;
292 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
296 if (sigc::slot_base * const slot =
297 Glib::SignalProxyNormal::data_to_slot(data))
298 (*static_cast<SlotType*>(slot))();
302 Glib::exception_handlers_invoke();
307 const Glib::SignalProxyInfo browser_widget_signal_net_start_info =
310 (GCallback) &browser_widget_signal_net_start_callback,
311 (GCallback) &browser_widget_signal_net_start_callback
314 void browser_widget_signal_net_stop_callback(GtkMozEmbed * self, void * data)
316 typedef sigc::slot<void> SlotType;
318 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
322 if (sigc::slot_base * const slot =
323 Glib::SignalProxyNormal::data_to_slot(data))
324 (*static_cast<SlotType*>(slot))();
328 Glib::exception_handlers_invoke();
333 const Glib::SignalProxyInfo browser_widget_signal_net_stop_info =
336 (GCallback) &browser_widget_signal_net_stop_callback,
337 (GCallback) &browser_widget_signal_net_stop_callback
340 void browser_widget_signal_new_window_callback(
341 GtkMozEmbed * self, GtkMozEmbed ** p0, guint p1, void * data)
343 typedef sigc::slot<browser_widget *, guint> SlotType;
345 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
349 if (sigc::slot_base * const slot =
350 Glib::SignalProxyNormal::data_to_slot(data))
352 if (browser_widget * result =
353 (*static_cast<SlotType*>(slot))(p1))
355 *p0 = result->gobj();
362 Glib::exception_handlers_invoke();
370 const Glib::SignalProxyInfo browser_widget_signal_new_window_info =
373 (GCallback) &browser_widget_signal_new_window_callback,
374 (GCallback) &browser_widget_signal_new_window_callback
377 void browser_widget_signal_visibility_callback(
378 GtkMozEmbed * self, gboolean p0, void * data)
380 typedef sigc::slot<void, bool> SlotType;
382 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
386 if (sigc::slot_base * const slot =
387 Glib::SignalProxyNormal::data_to_slot(data))
388 (*static_cast<SlotType*>(slot))(p0);
392 Glib::exception_handlers_invoke();
397 const Glib::SignalProxyInfo browser_widget_signal_visibility_info =
400 (GCallback) &browser_widget_signal_visibility_callback,
401 (GCallback) &browser_widget_signal_visibility_callback
404 void browser_widget_signal_destroy_browser_callback(
405 GtkMozEmbed * self, void * data)
407 typedef sigc::slot<void> SlotType;
409 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
413 if (sigc::slot_base * const slot =
414 Glib::SignalProxyNormal::data_to_slot(data))
415 (*static_cast<SlotType*>(slot))();
419 Glib::exception_handlers_invoke();
424 const Glib::SignalProxyInfo browser_widget_signal_destroy_info =
427 (GCallback) &browser_widget_signal_destroy_browser_callback,
428 (GCallback) &browser_widget_signal_destroy_browser_callback
431 gint browser_widget_signal_open_uri_callback(
432 GtkMozEmbed * self, const char * p0, void * data)
434 typedef sigc::slot<bool, const char *> SlotType;
436 if (Glib::ObjectBase::_get_current_wrapper((GObject *)self))
440 if (sigc::slot_base * const slot =
441 Glib::SignalProxyNormal::data_to_slot(data))
442 return (*static_cast<SlotType*>(slot))(p0);
446 Glib::exception_handlers_invoke();
453 const Glib::SignalProxyInfo browser_widget_signal_open_uri_info =
456 (GCallback) &browser_widget_signal_open_uri_callback,
457 (GCallback) &browser_widget_signal_open_uri_callback
462 Glib::SignalProxy0<void> browser_widget::signal_link_message()
464 return Glib::SignalProxy0<void>(this, &browser_widget_signal_link_message_info);
466 Glib::SignalProxy0<void> browser_widget::signal_js_status()
468 return Glib::SignalProxy0<void>(this, &browser_widget_signal_js_status_info);
470 Glib::SignalProxy0<void> browser_widget::signal_location()
472 return Glib::SignalProxy0<void>(this, &browser_widget_signal_location_info);
474 Glib::SignalProxy0<void> browser_widget::signal_title()
476 return Glib::SignalProxy0<void>(this, &browser_widget_signal_title_info);
478 Glib::SignalProxy2<void, gint /*cur*/, gint /*max*/> browser_widget::signal_progress()
480 return Glib::SignalProxy2<void, gint, gint>(
481 this, &browser_widget_signal_progress_info);
483 Glib::SignalProxy3<void, const char *, gint /*flags*/, guint /*status*/>
484 browser_widget::signal_net_state()
486 return Glib::SignalProxy3<void, const char *, gint, guint>(
487 this, &browser_widget_signal_net_state_info);
489 Glib::SignalProxy0<void> browser_widget::signal_net_start()
491 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_start_info);
493 Glib::SignalProxy0<void> browser_widget::signal_net_stop()
495 return Glib::SignalProxy0<void>(this, &browser_widget_signal_net_stop_info);
497 Glib::SignalProxy1<browser_widget *, guint /*chromemask*/> browser_widget::signal_new_window()
499 return Glib::SignalProxy1<browser_widget *, guint>(
500 this, &browser_widget_signal_new_window_info);
502 Glib::SignalProxy1<void, bool /*visibility*/> browser_widget::signal_visibility()
504 return Glib::SignalProxy1<void, bool>(
505 this, &browser_widget_signal_visibility_info);
507 Glib::SignalProxy0<void> browser_widget::signal_destroy()
509 return Glib::SignalProxy0<void>(this, &browser_widget_signal_destroy_info);
511 Glib::SignalProxy1<bool, const char * /*uri*/> browser_widget::signal_open_uri()
513 return Glib::SignalProxy1<bool, const char *>(
514 this, &browser_widget_signal_open_uri_info);
517 browser_widget::browser_widget(GObject * gobject, bool take_copy)
519 assert(GTK_MOZ_EMBED(gobject));
524 Glib::ObjectBase * browser_widget::wrap_new(GObject * gobject)
526 return new browser_widget(gobject, false);
529 browser_widget::initialiser::initialiser()
531 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
532 static const GREVersionRange gre_versions = {
537 check(GRE_GetGREPathWithProperties(&gre_versions, 1, 0, 0,
538 path, sizeof(path)));
540 check(XPCOMGlueStartup(path));
541 check(GTKEmbedGlueStartup());
542 check(GTKEmbedGlueStartupInternal());
544 char * last_slash = std::strrchr(path, '/');
545 if (last_slash != path)
547 gtk_moz_embed_set_path(path);
549 gtk_moz_embed_set_comp_path(MOZ_LIB_DIR);
552 gtk_moz_embed_push_startup();
554 wrap_register(gtk_moz_embed_get_type(), wrap_new);
557 browser_widget::initialiser::~initialiser()
559 gtk_moz_embed_pop_startup();
561 #if MOZ_VERSION_MAJOR == 1 && MOZ_VERSION_MINOR == 9
568 browser_widget * wrap(GtkMozEmbed * object, bool take_copy)
570 return dynamic_cast<browser_widget *>(
571 Glib::wrap_auto((GObject*)(object), take_copy));