diff --git a/lib/python/_sugar.defs b/lib/python/_sugar.defs index add3b8fe..00659072 100644 --- a/lib/python/_sugar.defs +++ b/lib/python/_sugar.defs @@ -1,5 +1,14 @@ ;; -*- scheme -*- ; object definitions ... + +(define-boxed SugarBrowserEvent + (in-module "Sugar") + (c-name "SugarBrowserEvent") + (gtype-id "SUGAR_TYPE_BROWSER_EVENT") + (copy-func "sugar_browser_event_copy") + (release-func "sugar_browser_event_free") +) + (define-object AddressEntry (in-module "Sugar") (parent "GtkEntry") @@ -89,6 +98,25 @@ (return-type "none") ) +(define-method save_uri + (of-object "SugarBrowser") + (c-name "sugar_browser_save_uri") + (return-type "none") + (parameters + '("const-char*" "uri") + '("const-char*" "filename") + ) +) + +(define-method save_document + (of-object "SugarBrowser") + (c-name "sugar_browser_save_document") + (return-type "none") + (parameters + '("const-char*" "filename") + ) +) + (define-method create_window (of-object "SugarBrowser") (c-name "sugar_browser_create_window") diff --git a/lib/python/_sugar.override b/lib/python/_sugar.override index 3c035808..09114528 100644 --- a/lib/python/_sugar.override +++ b/lib/python/_sugar.override @@ -179,3 +179,23 @@ _wrap_sugar_cairo_surface_from_gdk_pixbuf(PyGObject *self, PyObject *args, PyObj return PycairoSurface_FromSurface(surface, NULL); } %% +override-slot SugarBrowserEvent.tp_getattr +static PyObject * +_wrap_sugar_browser_event_tp_getattr(PyObject *self, char *attr) +{ + SugarBrowserEvent *event = pyg_boxed_get(self, SugarBrowserEvent); + + if (!strcmp(attr, "__members__")) + return Py_BuildValue("[s]", "image_uri"); + if (!strcmp(attr, "image_uri")) { + if (event->image_uri) { + return PyString_FromString(event->image_uri); + } else { + Py_INCREF(Py_None); + return Py_None; + } + } + + return NULL; +} +%% diff --git a/lib/python/gtkmozembed.override b/lib/python/gtkmozembed.override index f9994770..579af10b 100644 --- a/lib/python/gtkmozembed.override +++ b/lib/python/gtkmozembed.override @@ -8,8 +8,6 @@ headers #include -%% -modulename gtkmozembed %% import gobject.GObject as PyGObject_Type import gtk.Object as PyGtkObject_Type diff --git a/lib/src/sugar-browser.cpp b/lib/src/sugar-browser.cpp index 8d49c001..e0d0fd7d 100644 --- a/lib/src/sugar-browser.cpp +++ b/lib/src/sugar-browser.cpp @@ -20,6 +20,7 @@ #include #include "sugar-browser.h" +#include "sugar-marshal.h" #include "GeckoContentHandler.h" #include "GeckoDownload.h" @@ -32,9 +33,13 @@ #include #include #include +#include #include #include #include +#include +#include +#include enum { PROP_0, @@ -46,6 +51,13 @@ enum { PROP_LOADING }; +enum { + MOUSE_CLICK, + N_SIGNALS +}; + +static guint signals[N_SIGNALS]; + static const nsModuleComponentInfo sSugarComponents[] = { { "Gecko Content Handler", @@ -190,6 +202,16 @@ sugar_browser_class_init(SugarBrowserClass *browser_class) gobject_class->get_property = sugar_browser_get_property; + signals[MOUSE_CLICK] = g_signal_new ("mouse_click", + SUGAR_TYPE_BROWSER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(SugarBrowser, mouse_click), + g_signal_accumulator_true_handled, NULL, + sugar_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, + 1, + SUGAR_TYPE_BROWSER_EVENT); + g_object_class_install_property(gobject_class, PROP_PROGRESS, g_param_spec_double ("progress", "Progress", @@ -350,6 +372,59 @@ location_cb(GtkMozEmbed *embed) update_navigation_properties(browser); } +static gboolean +dom_mouse_click_cb(GtkMozEmbed *embed, nsIDOMMouseEvent *mouseEvent) +{ + SugarBrowser *browser = SUGAR_BROWSER(embed); + SugarBrowserEvent *event; + gint return_value = FALSE; + + nsCOMPtr eventTarget; + mouseEvent->GetTarget(getter_AddRefs(eventTarget)); + NS_ENSURE_TRUE(mouseEvent, FALSE); + + nsCOMPtr targetNode; + targetNode = do_QueryInterface(eventTarget); + NS_ENSURE_TRUE(targetNode, FALSE); + + event = sugar_browser_event_new(); + + nsresult rv; + + PRUint16 type; + rv = targetNode->GetNodeType(&type); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + + nsCOMPtr element = do_QueryInterface(targetNode); + if ((nsIDOMNode::ELEMENT_NODE == type) && element) { + nsString uTag; + rv = element->GetLocalName(uTag); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + + nsCString tag; + NS_UTF16ToCString (uTag, NS_CSTRING_ENCODING_UTF8, tag); + + if (g_ascii_strcasecmp (tag.get(), "img") == 0) { + nsString img; + + nsCOMPtr image; + image = do_QueryInterface(targetNode, &rv); + if (NS_FAILED(rv) || !image) return NS_ERROR_FAILURE; + + rv = image->GetSrc(img); + if (NS_FAILED(rv)) return NS_ERROR_FAILURE; + + nsCString cImg; + NS_UTF16ToCString (img, NS_CSTRING_ENCODING_UTF8, cImg); + event->image_uri = g_strdup(cImg.get()); + } + } + + g_signal_emit(browser, signals[MOUSE_CLICK], 0, event, &return_value); + + return return_value; +} + static void sugar_browser_init(SugarBrowser *browser) { @@ -365,6 +440,8 @@ sugar_browser_init(SugarBrowser *browser) G_CALLBACK(title_cb), NULL); g_signal_connect(G_OBJECT(browser), "location", G_CALLBACK(location_cb), NULL); + g_signal_connect(G_OBJECT(browser), "dom-mouse-click", + G_CALLBACK(dom_mouse_click_cb), NULL); } void @@ -385,7 +462,7 @@ sugar_browser_scroll_pixels(SugarBrowser *browser, nsCOMPtr DOMWindow; webBrowserFocus->GetFocusedWindow (getter_AddRefs(DOMWindow)); if (!DOMWindow) { - webBrowser->GetContentDOMWindow (getter_AddRefs (DOMWindow)); + webBrowser->GetContentDOMWindow (getter_AddRefs(DOMWindow)); } NS_ENSURE_TRUE (DOMWindow, ); @@ -406,3 +483,60 @@ sugar_browser_grab_focus(SugarBrowser *browser) g_warning ("Need to realize the embed before grabbing focus!\n"); } } + +void +sugar_browser_save_uri(SugarBrowser *browser, + const char *uri, + const char *filename) +{ +} + +void +sugar_browser_save_document(SugarBrowser *browser, + const char *filename) +{ +} + +GType +sugar_browser_event_get_type(void) +{ + static GType type = 0; + + if (G_UNLIKELY(type == 0)) { + type = g_boxed_type_register_static("SugarBrowserEvent", + (GBoxedCopyFunc)sugar_browser_event_copy, + (GBoxedFreeFunc)sugar_browser_event_free); + } + + return type; +} + +SugarBrowserEvent * +sugar_browser_event_new(void) +{ + SugarBrowserEvent *event; + + event = g_new0(SugarBrowserEvent, 1); + + return event; +} + +SugarBrowserEvent * +sugar_browser_event_copy(SugarBrowserEvent *event) +{ + g_return_val_if_fail(event != NULL, NULL); + + return (SugarBrowserEvent *)g_memdup(event, sizeof(SugarBrowserEvent)); +} + +void +sugar_browser_event_free(SugarBrowserEvent *event) +{ + g_return_if_fail(event != NULL); + + if (event->image_uri) { + g_free(event->image_uri); + } + + g_free(event); +} diff --git a/lib/src/sugar-browser.h b/lib/src/sugar-browser.h index f2af9b85..63d1e1dd 100644 --- a/lib/src/sugar-browser.h +++ b/lib/src/sugar-browser.h @@ -24,8 +24,9 @@ G_BEGIN_DECLS -typedef struct _SugarBrowser SugarBrowser; +typedef struct _SugarBrowser SugarBrowser; typedef struct _SugarBrowserClass SugarBrowserClass; +typedef struct _SugarBrowserEvent SugarBrowserEvent; #define SUGAR_TYPE_BROWSER (sugar_browser_get_type()) #define SUGAR_BROWSER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), SUGAR_TYPE_BROWSER, SugarBrowser)) @@ -45,6 +46,9 @@ struct _SugarBrowser { gboolean can_go_back; gboolean can_go_forward; gboolean loading; + + gboolean (* mouse_click) (SugarBrowser *browser, + SugarBrowserEvent *event); }; struct _SugarBrowserClass { @@ -59,11 +63,26 @@ void sugar_browser_scroll_pixels (SugarBrowser *browser, int dx, int dy); void sugar_browser_grab_focus (SugarBrowser *browser); +void sugar_browser_save_uri (SugarBrowser *browser, + const char *uri, + const char *filename); +void sugar_browser_save_document (SugarBrowser *browser, + const char *filename); gboolean sugar_browser_startup (const char *profile_path, const char *profile_name); void sugar_browser_shutdown (void); +#define SUGAR_TYPE_BROWSER_EVENT (sugar_browser_event_get_type()) + +struct _SugarBrowserEvent { + char *image_uri; +}; + +GType sugar_browser_event_get_type (void); +SugarBrowserEvent *sugar_browser_event_new (void); +SugarBrowserEvent *sugar_browser_event_copy (SugarBrowserEvent *event); +void sugar_browser_event_free (SugarBrowserEvent *event); G_END_DECLS diff --git a/lib/src/sugar-marshal.list b/lib/src/sugar-marshal.list index de45d7ad..81b3ae12 100644 --- a/lib/src/sugar-marshal.list +++ b/lib/src/sugar-marshal.list @@ -1,3 +1,4 @@ VOID:OBJECT,STRING,LONG,LONG VOID:OBJECT,LONG VOID:OBJECT +BOOLEAN:BOXED