[evolution-rss] implement right click browser operations
- From: Lucian Langa <lucilanga src gnome org>
- To: svn-commits-list gnome org
- Subject: [evolution-rss] implement right click browser operations
- Date: Sun, 3 May 2009 15:16:38 -0400 (EDT)
commit 8e02b09f6268742248f8d52a23a1c3380731599b
Author: Lucian Langa <lucilanga gnome org>
Date: Sun May 3 22:16:14 2009 +0300
implement right click browser operations
---
ChangeLog | 11 ++++
TODO | 2 +-
src/gecko-utils.cpp | 73 +++++++++++++++++++++++++++
src/gecko-utils.h | 2 +
src/rss.c | 135 +++++++++++++++++++++++++++++++++++++++++++++++---
5 files changed, 213 insertions(+), 10 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 8a64d7c..b7e49aa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2009-05-03 Lucian Langa <lucilanga gnome org>
+
+ * src/gecko-utils.cpp:
+ * src/gecko-utils.h:
+ * src/rss.c (browser_write), (browsercb), (back_cb), (forward_cb),
+ (rss_popup_zoom_in), (rss_popup_zoom_out), (rss_popup_zoom_orig),
+ (rss_popup_link_copy), (rss_popup_link_open),
+ (rss_menu_items_free), (webkit_click), (gecko_click),
+ (org_gnome_rss_browser), (org_gnome_cooly_format_rss): Implement right
+ click operations
+
2009-05-01 Lucian Langa <lucilanga gnome org>
* src/rss.c (browser_write), (reload_cb), (mycall),
diff --git a/TODO b/TODO
index f74bb73..1e8eb29 100644
--- a/TODO
+++ b/TODO
@@ -42,7 +42,6 @@
#15 0x00007f257c9dec29 in rss_error (key=<value optimized out>,
name=<value optimized out>, error=<value optimized out>,
emsg=<value optimized out>) at rss.c:273
- * implement right-click in browser
* slow delete operation on large folders
* check operation cancel button
* add icon to feed setup panel
@@ -60,3 +59,4 @@
* check s&r progress bar on Complete.
* store feed in an alternate file to serve images from
* migrate fetch_blocking -> fetch_unblocking
+ * grey stop button on complete load
diff --git a/src/gecko-utils.cpp b/src/gecko-utils.cpp
index e0c2096..fc557a0 100644
--- a/src/gecko-utils.cpp
+++ b/src/gecko-utils.cpp
@@ -44,6 +44,11 @@
#include <nsIPrefService.h>
#include <nsIServiceManager.h>
#include <nsServiceManagerUtils.h>
+#include <nsIDOMMouseEvent.h>
+#include <nsIDOMWindow.h>
+#include <nsIContentViewer.h>
+#include <nsIDocShell.h>
+#include <nsIMarkupDocumentViewer.h>
#include <nspr.h>
static nsIPrefBranch* gPrefBranch;
@@ -72,6 +77,74 @@ gecko_prefs_set_int (const gchar *key, gint value)
return NS_SUCCEEDED(gPrefBranch->SetIntPref (key, value));
}
+/**
+ * * Takes a pointer to a mouse event and returns the mouse
+ * * button number or -1 on error.
+ * */
+extern "C"
+gint gecko_get_mouse_event_button(gpointer event) {
+ gint button = 0;
+
+ g_return_val_if_fail (event, -1);
+
+ /* the following lines were found in the Galeon source */
+ nsIDOMMouseEvent *aMouseEvent = (nsIDOMMouseEvent *) event;
+ aMouseEvent->GetButton ((PRUint16 *) &button);
+
+ /* for some reason we get different numbers on PPC, this fixes
+ * * that up... -- MattA */
+ if (button == 65536)
+ {
+ button = 1;
+ }
+ else if (button == 131072)
+ {
+ button = 2;
+ }
+
+ return button;
+}
+
+extern "C" void
+gecko_set_zoom (GtkWidget *moz, gfloat zoom)
+{
+ nsCOMPtr<nsIWebBrowser> mWebBrowser;
+ nsCOMPtr<nsIDOMWindow> mDOMWindow;
+
+ gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (moz), getter_AddRefs (mWebBrowser));
+ if (NULL == mWebBrowser) {
+ g_warning ("gecko_set_zoom(): Could not retrieve browser...");
+ return;
+ }
+ mWebBrowser->GetContentDOMWindow (getter_AddRefs (mDOMWindow));
+ if (NULL == mDOMWindow) {
+ g_warning ("gecko_set_zoom(): Could not retrieve DOM window...");
+ return;
+ }
+ mDOMWindow->SetTextZoom (zoom);
+}
+
+extern "C" gfloat
+gecko_get_zoom (GtkWidget *embed)
+{
+ nsCOMPtr<nsIWebBrowser> mWebBrowser;
+ nsCOMPtr<nsIDOMWindow> mDOMWindow;
+ float zoom;
+
+ gtk_moz_embed_get_nsIWebBrowser (GTK_MOZ_EMBED (embed), getter_AddRefs (mWebBrowser));
+ if (NULL == mWebBrowser) {
+ g_warning ("gecko_get_zoom(): Could not retrieve browser...");
+ return 1.0;
+ }
+ mWebBrowser->GetContentDOMWindow (getter_AddRefs (mDOMWindow));
+ if (NULL == mDOMWindow) {
+ g_warning ("gecko_get_zoom(): Could not retrieve DOM window...");
+ return 1.0;
+ }
+ mDOMWindow->GetTextZoom (&zoom);
+ return zoom;
+}
+
extern "C" gboolean
gecko_init (void)
{
diff --git a/src/gecko-utils.h b/src/gecko-utils.h
index 08803c3..5da2590 100644
--- a/src/gecko-utils.h
+++ b/src/gecko-utils.h
@@ -29,6 +29,8 @@ gboolean gecko_prefs_set_bool (const gchar *key, gboolean value);
gboolean gecko_prefs_set_string (const gchar *key, const gchar *value);
gboolean gecko_init (void);
void gecko_shutdown (void);
+void gecko_set_zoom (GtkWidget *moz, gfloat zoom);
+gfloat gecko_get_zoom (GtkWidget *moz);
G_END_DECLS
diff --git a/src/rss.c b/src/rss.c
index 0d827a3..4f59f35 100644
--- a/src/rss.c
+++ b/src/rss.c
@@ -516,10 +516,8 @@ browser_write(gchar *string, gint length, gchar *base)
#endif
break;
case 1:
- webkit_web_view_load_string(WEBKIT_WEB_VIEW(rf->mozembed),
+ webkit_web_view_load_html_string(WEBKIT_WEB_VIEW(rf->mozembed),
string,
- "text/html",
- "utf-8",
base);
break;
}
@@ -532,7 +530,9 @@ browsercb(NetStatusType status, gpointer statusdata, gint data)
switch (status) {
case NET_STATUS_PROGRESS:
// g_print("chunk:%s\n", progress->chunk);
- g_print("\n\n\n--------------\n %d \n=============\n\n\n", progress->chunksize);
+ g_print("total:%d\n", progress->total);
+ g_print("curent:%d\n", progress->current);
+ g_print("--------------\n chunk: %d \n=============\n", progress->chunksize);
// browser_write(progress->chunk, progress->chunksize);
// browser_fill+=progress->chunksize;
break;
@@ -1432,7 +1432,7 @@ back_cb (GtkWidget *button, EMFormatHTMLPObject *pobject)
#endif
#if HAVE_WEBKIT
if (engine == 1)
- webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(rf->mozembed));
+ webkit_web_view_go_back (WEBKIT_WEB_VIEW(rf->mozembed));
#endif
}
@@ -1446,7 +1446,7 @@ forward_cb (GtkWidget *button, EMFormatHTMLPObject *pobject)
#endif
#if HAVE_WEBKIT
if (engine == 1)
- webkit_web_view_stop_loading(WEBKIT_WEB_VIEW(rf->mozembed));
+ webkit_web_view_go_forward(WEBKIT_WEB_VIEW(rf->mozembed));
#endif
}
@@ -1586,6 +1586,119 @@ render_set_preferences(void)
}
#endif
+static void
+rss_popup_zoom_in(EPopup *ep, EPopupItem *pitem, void *data)
+{
+ gfloat zoom = gecko_get_zoom(rf->mozembed);
+ zoom*=1.2;
+ gecko_set_zoom(rf->mozembed, zoom);
+}
+
+static void
+rss_popup_zoom_out(EPopup *ep, EPopupItem *pitem, void *data)
+{
+ gfloat zoom = gecko_get_zoom(rf->mozembed);
+ zoom/=1.2;
+ gecko_set_zoom(rf->mozembed, zoom);
+}
+
+static void
+rss_popup_zoom_orig(EPopup *ep, EPopupItem *pitem, void *data)
+{
+ gecko_set_zoom(rf->mozembed, 1);
+}
+
+static void
+rss_popup_link_copy(EPopup *ep, EPopupItem *pitem, void *data)
+{
+ gtk_clipboard_set_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY), data, -1);
+ gtk_clipboard_set_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), data, -1);
+}
+
+static void
+rss_popup_link_open(EPopup *ep, EPopupItem *pitem, void *data)
+{
+ e_show_uri (NULL, data);
+}
+
+static EPopupItem rss_menu_items[] = {
+ { E_POPUP_BAR, "05.rss-browser", },
+ { E_POPUP_ITEM, "05.rss-browser.00", N_("_Copy"), NULL, NULL, "edit-copy", EM_FOLDER_VIEW_SELECT_DISPLAY|EM_FOLDER_VIEW_SELECT_SELECTION },
+ { E_POPUP_BAR, "05.rss-browser.01", NULL, NULL, NULL, NULL },
+ { E_POPUP_ITEM, "05.rss-browser.02", N_("Zoom _In"), rss_popup_zoom_in, NULL, "zoom-in", EM_POPUP_URI_HTTP },
+ { E_POPUP_ITEM, "05.rss-browser.03", N_("Zoom _Out"), rss_popup_zoom_out, NULL, "zoom-out", EM_POPUP_URI_HTTP },
+ { E_POPUP_ITEM, "05.rss-browser.04", N_("_Normal Size"), rss_popup_zoom_orig, NULL, "zoom-original", EM_POPUP_URI_HTTP },
+ { E_POPUP_BAR, "05.rss-browser.05", NULL, NULL, NULL, NULL },
+ { E_POPUP_ITEM, "05.rss-browser.06", N_("_Print..."), NULL, NULL, "document-print", EM_POPUP_SELECT_ONE },
+ { E_POPUP_ITEM, "05.rss-browser.07", N_("Save _As"), NULL, NULL, "document-save-as", 0},
+ { E_POPUP_BAR, "05.rss-browser.08", NULL, NULL, NULL, NULL },
+ { E_POPUP_ITEM, "05.rss-browser.09", N_("_Open Link in Browser"), rss_popup_link_open, NULL, NULL, EM_POPUP_URI_HTTP },
+ { E_POPUP_ITEM, "05.rss-browser.10", N_("_Copy Link Location"), rss_popup_link_copy, NULL, "edit-copy" },
+};
+
+static void
+rss_menu_items_free(EPopup *ep, GSList *items, void *data)
+{
+ g_slist_free(items);
+}
+
+static gboolean
+webkit_click (WebKitWebView *view, WebKitWebFrame *frame, WebKitNetworkRequest *request)
+{
+ const gchar *uri;
+
+ g_return_if_fail (WEBKIT_IS_WEB_VIEW (view));
+// g_return_if_fail (WEBKIT_IS_NETWORK_REQUEST (request));
+
+ uri = webkit_network_request_get_uri (request);
+ g_print("uri:%s\n", uri);
+ return TRUE;
+}
+
+gboolean
+gecko_click(GtkMozEmbed *mozembed, gpointer dom_event, gpointer user_data)
+{
+ gint button;
+ GtkMenu *menu;
+ GSList *menus = NULL;
+ EMPopup *emp;
+ gint i=0, menu_size;
+ EMPopupTargetURI *t;
+ EPopupTarget *target;
+
+ if (-1 == (button = gecko_get_mouse_event_button (dom_event))) {
+ g_warning ("Cannot determine mouse button!\n");
+ return FALSE;
+ }
+
+ gchar *link = gtk_moz_embed_get_link_message(GTK_MOZ_EMBED(rf->mozembed));
+ emp = em_popup_new("org.gnome.evolution.mail.formathtmldisplay.popup");
+// t = em_popup_target_new_part(emp, user_data, NULL);
+// t = em_popup_target_new_uri(emp, link);
+ // target = (EPopupTarget *)t;
+// target = em_popup_target_new_part(emp, info->puri.part, info->handle?info->handle->mime_type:NULL);
+// target->target.widget = w;
+
+ menu_size=sizeof(rss_menu_items)/sizeof(rss_menu_items[0]);
+ if (strlen(link))
+ i+=9;
+ else
+ menu_size-=2;
+
+ for (i; i<menu_size; i++)
+ menus = g_slist_prepend(menus, &rss_menu_items[i]);
+
+ e_popup_add_items((EPopup *)emp, menus, NULL, rss_menu_items_free, link);
+ menu = e_popup_create_menu_once((EPopup *)emp, target, 0);
+
+ if (button == 2)
+ gtk_menu_popup(menu, NULL, NULL, NULL, NULL, button, gtk_get_current_event_time());
+ /*normal click let event pass normally*/
+ if (button == 0)
+ gtk_moz_embed_load_url(rf->mozembed, link);
+ g_print("button:%d\n", button);
+}
+
#ifdef HAVE_RENDERKIT
static gboolean
org_gnome_rss_browser (EMFormatHTML *efh, void *eb, EMFormatHTMLPObject *pobject)
@@ -1607,9 +1720,10 @@ org_gnome_rss_browser (EMFormatHTML *efh, void *eb, EMFormatHTMLPObject *pobject
#ifdef HAVE_WEBKIT
if (engine == 1) {
rf->mozembed = (GtkWidget *)webkit_web_view_new();
- //gtk_container_add(GTK_CONTAINER(moz), GTK_WIDGET(rf->mozembed));
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(moz), GTK_WIDGET(rf->mozembed));
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(moz), GTK_SHADOW_ETCHED_OUT);
+ gtk_container_add(GTK_CONTAINER(moz), GTK_WIDGET(rf->mozembed));
+ g_signal_connect (rf->mozembed, "navigation-requested", G_CALLBACK (webkit_click), moz);
+ // gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(moz), GTK_WIDGET(rf->mozembed));
+ // gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(moz), GTK_SHADOW_ETCHED_OUT);
}
#endif
@@ -1621,6 +1735,7 @@ org_gnome_rss_browser (EMFormatHTML *efh, void *eb, EMFormatHTMLPObject *pobject
/* FIXME add all those profile shits */
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(moz), GTK_WIDGET(rf->mozembed));
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(moz), GTK_SHADOW_ETCHED_OUT);
+ g_signal_connect (rf->mozembed, "dom_mouse_click", G_CALLBACK(gecko_click), moz);
}
#endif
@@ -1889,6 +2004,7 @@ void org_gnome_cooly_format_rss(void *ep, EMFormatHookTarget *t) //camelmimepart
pobj->is_html = GPOINTER_TO_INT(is_html);
pobj->format = (EMFormatHTML *)t->format;
pobj->object.free = pfree;
+ pobj->part = t->part;
camel_stream_printf (t->stream,
"<div style=\"border: solid #%06x 1px; background-color: #%06x; color: #%06x;\">\n",
frame_colour & 0xffffff, content_colour & 0xffffff, text_colour & 0xffffff);
@@ -2789,6 +2905,7 @@ finish_website (SoupSession *soup_sess, SoupMessage *msg, gint user_data)
guint engine = fallback_engine();
g_print("browser full:%d\n", response->len);
g_print("browser fill:%d\n", browser_fill);
+ if (response->len)
g_print("browser fill:%d%%\n", (browser_fill*100)/response->len);
gchar *str = (response->str);
gint len = strlen(response->str);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]